关于n!被整除的问题【算法实现】
2011-04-06 22:20
330 查看
传统的方法:
//输入: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 100
struct 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;
}
//输入: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 100
struct 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;
}
相关文章推荐
- 【Algorithm】关于n!被整除的问题【算法实现】
- 关于RSA硬件算法的实现问题!
- 【经典算法】:关于硬币称重问题及编程实现
- 关于《射雕英雄传》的数学算法问题 JAVA实现
- 关于烙饼排序问题的算法与Java实现
- 关于算法—— 一维字符串数组之间组合问题的C#实现
- 关于棋盘马走“日”字问题的回溯算法实现
- 关于《四元数插值算法实现游戏角色平滑旋转》中的算法一些问题
- 关于最短路径图算法实现的问题
- 《机器学习实战》——k-近邻算法Python实现问题记录
- 关于一行代码实现两个整型变量值互换的问题
- c语言实现排列组合算法问题
- 棋盘覆盖问题的算法实现
- 算法java实现--回溯法--图的m着色问题
- 问题:关于一个贴友的js留言板的实现
- 回溯算法——收费公路重建问题python实现
- 骑士移动问题 实现的三种算法 POJ 2243,ZOJ 1091
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 【先进的算法】Lasvegas算法3SAT问题(C++实现代码)
- 转 C# , ASP.Net 中 关于 like in 实现参数化查询的问题