【Algorithm】关于n!被整除的问题【算法实现】
来源:互联网 发布:excel03显示重复数据 编辑:程序博客网 时间:2024/05/22 01:35
传统的方法:
//输入:int a, n;//输出:int i;//算法效果:求最大的i, 使得n!(n的阶乘)可以被a^i(a的i次方)整除,而不能被a^(i+1)(a的i+1次方)整除。#include<iostream.h>#include<string.h>double fac(int n);int inline fun1(int a,int n);//int fun2(int a,int n);void main(){ int n; int a; cout<<"n=";cin>>n; cout<<"a=";cin>>a; cout<<"最大的fun1 i="<<fun1(a,n)<<endl;}//阶乘计算double fac(int n){ if(n==0) return 1; else { double re=1; for(int i=1;i<=n;i++) { re=re*i; } return re; }}int inline fun1(int a,int n){ if(a==1) return -1;//此时最大的i为无穷大 int p=0; int sum=fac(n); int a_p=a; while(1) { if((sum%(a_p))==0) { p++; a_p=a_p*a; } else { break; } } return p;}
使用质数分解实现(非传统方法):
//输入:int a, n;//输出:int i;//算法效果:求最大的i, 使得n!(n的阶乘)可以被a^i(a的i次方)整除,而不能被a^(i+1)(a的i+1次方)整除。#include<iostream.h>#define SIZE 100struct PrimeItem{ int prime;//质数值 int count;//质数数量};int* prime_factors(int n);//分解质因数PrimeItem* GetItemArray(int n);//获取质数item链表int Local(PrimeItem array[],int x);//元素定位int MaxJ(int *prime,PrimeItem *arrayitem);void main(){ int n,a; cout<<"n=";cin>>n; cout<<"a=";cin>>a; int *prime=prime_factors(a); PrimeItem *arrayitem=GetItemArray(n); cout<<"MaxJ="<<MaxJ(prime,arrayitem)<<endl; }//===============分解质因数================// int* prime_factors(int n){ int *array=new int[SIZE]; int index=0; for(int i=2;i<=n;i++) { while(n!=i) { if(n%i==0) { array[index]=i; index++; n=n/i; } else break; } } array[index]=n;// index++; array[index]=0;//设置结束标志 return array;}PrimeItem* GetItemArray(int n){ PrimeItem *arraylist=new PrimeItem[SIZE]; int *temp=new int[SIZE]; int i,j; int currentindex=0; int find; for(i=0;i<SIZE;i++) { arraylist[i].count=0; arraylist[i].prime=0; } for(i=2;i<=n;i++) { temp=prime_factors(i); j=0; while(temp[j]!=0) { find=Local(arraylist,temp[j]); if(find==-1) { //没有找到 arraylist[currentindex].prime=temp[j]; arraylist[currentindex].count=1; currentindex++; } else { //该质数已经存在于质数item数组中 //count+1 arraylist[find].count++; } j++; } } return arraylist;}int MaxJ(int *prime,PrimeItem *arrayitem){ int i; int count=0; int find; int condition=1; while(condition) { for(i=0;prime[i]!=0;i++) { find=Local(arrayitem,prime[i]); if(find==-1)//没有找到质数元素 { break; //结束循环 } else { arrayitem[find].count--; if(arrayitem[find].count==0) { arrayitem[find].prime=1;//置1 } } } if(prime[i]==0&&i!=0) { count++; //condition=1;//继续循环 } else { condition=0; } } return count;}int Local(PrimeItem *array,int x){ for(int i=0;array[i].prime!=0;i++) { if(array[i].prime==x) return i; } return -1;}
0 0
- 【Algorithm】关于n!被整除的问题【算法实现】
- 一连串1组成的数被n整除问题
- n! 是否能整除 m 的问题
- 1-9组成9位数,各位不同,前n位能被n整除的算法
- 关于整除一类的dp问题
- 关于N的阶乘(n!)的java算法实现
- 编程算法 - 最小能被1至n整除的数 代码(C)
- 编程算法 - 最小能被1至n整除的数 代码(C)
- 算法训练 整除问题
- 算法训练 整除问题
- 关于实现魔方复原的Thistlethwaite Algorithm
- 关于N皇后问题高效试探回溯算法的分析
- 关于N皇后问题高效试探回溯算法的分析
- 关于N皇后问题高效试探回溯算法的分析
- 关于N皇后问题的非递归算法浅析
- 关于Top n算法问题的一个思路
- 基于迪科斯彻算法(Dijkstra's algorithm)的次短路径问题的java实现
- UVA 10139 判断n的阶乘能否被m整除
- malloc,free的简单实现
- Mina、Netty、Twisted一起学(九):异步IO和回调函数
- for 和 foreach 的区别
- 通过网页获取路由器外网IP地址
- webView 报错
- 【Algorithm】关于n!被整除的问题【算法实现】
- linux创建守护进程
- 基于TCP协议的视频传输
- Android Graphics Architecture翻译(上)
- android中intent传递参数
- 第七周项目2电阻并联
- 高性能网络编程5--IO复用与并发编程
- select下拉列表级联
- Ubuntu修改默认键盘布局的方法(适用于13.04|14.04)