1.因式分解
#include<stdio.h>
#include<string.h>
int Prime(int x,int prime[]);
int IsPrime(int x,int prime[],int maxnum);
int main()
{
int num,i,len,n=0;
int prime[1300]={2,},factor[500];
scanf("%d",&num);
len=Prime(num,prime);
for(i=0;i<len;)
{
if(num%prime[i]==0)
{
factor[n]=prime[i];
num=num/prime[i];
n++;
}
else i++;
}
printf("number的因数有:");
for(i=0;i<n;i++) printf("%d ",factor[i]);
//for(i=0;i<len;i++) printf("%d ",prime[i]); //打印质数表
return 0;
}
int Prime(int x,int prime[])
{
int cnt=1,i=3;
for(i;i<x;i++)
{
if(IsPrime(i,prime,cnt))
{
prime[cnt]=i;
cnt++;
}
}
return cnt;
}
int IsPrime(int x,int prime[],int maxnum)
{
int i;
for(i=0;i<maxnum;i++)
{
if(x%prime[i]==0) return 0;
}
return 1;
}
2.求完美数
#include<stdio.h>
int Prime(int x,int prime[]);
int IsPrime(int x,int prime[],int maxnum);
int Factor(int prime[],int factor[],int number[],int num);
void clean(int Array[],int len);
int main()
{
int num=10000,len,i,n,m=0,p=0,q,a=1,b=1;
int prime[1300]={2,},factor[500],number[500],all[500];
len=Prime(num,prime); //得到质数表
for(i=2;i<num;i++)
{
m=0;
b=1;
clean(factor,500);
clean(number,500);//初始化数组
n=Factor(prime,factor,number,i);//得到不同因数及其个数
for(p=0;p<n;p++)
{
all[p]=1;
for(q=0;q<=number[m];q++)
{
a=a*factor[p];
all[p]+=a;
}
a=1;
m++;
}//得到例如(2零次方+2一次方+…)
for(p=0;p<n;p++)
{
b=b*all[p];//得到(2的和)*(3的和)*……
}
if(b==2*i) printf("%d ",i);
}
/*
printf("number的因数有:");
for(i=0;i<n;i++) printf("%d ",factor[i]);
*/
//for(i=0;i<len;i++) printf("%d ",prime[i]); //打印质数表
return 0;
}
int Prime(int x,int prime[])
{
int cnt=1,i=3;
for(i;i<x;i++)
{
if(IsPrime(i,prime,cnt))
{
prime[cnt]=i;
cnt++;
}
}
return cnt;
}
int IsPrime(int x,int prime[],int maxnum)
{
int i;
for(i=0;i<maxnum;i++)
{
if(x%prime[i]==0) return 0;
}
return 1;
}
int Factor(int prime[],int factor[],int number[],int num)
{
int i=0,n=0,m=0;
for(i=0;num>=prime[i];)
{
if(num%prime[i]==0)
{
if(n==0)
{
factor[n]=prime[i];
num=num/prime[i];
n++;
}
else
{
if(prime[i]==factor[n-1])
{
num=num/prime[i];
number[m]++;
}
else
{
factor[n]=prime[i];
num=num/prime[i];
m++;
n++;
}
}
}
else
i++;
}
return n;
}
void clean(int Array[],int len)
{
int i=0;
for(i;i<len;i++)
{
Array[i]=0;
}
}