王道机试4.7 分解素因数 含练习
例4.8质因数的个数
#include<stdio.h>
int prime[100000];
int primesize;
bool mark[100001];
void init()
{
for(int i=1;i<=100000;i++)
mark[i]=false;
primesize=0;
for(int i=2;i<=100000;i++)
{
if(mark[i]==true) continue;
prime[primesize++]=i;
for(int j=i*i;j<=100000;j=j+i)
mark[j]=true;
}
}
int main()
{
init();
int n;
while(scanf("%d",&n)!=EOF)
{
int ansprime[30];
int anssize=0;
int ansnum[30];
for(int i=0;i<primesize;i++)
{
if(n%prime[i]==0)
{
ansprime[anssize]=prime[i];
ansnum[anssize]=0;
while(n%prime[i]==0)
{
ansnum[anssize]++;
n=n/prime[i];
}
anssize++;
if(n==1)
break;
}
}
if(n!=1)
{
ansprime[anssize]=n;
ansnum[anssize]=1;
anssize++;
}
int ans=0;
for(int i=0;i<anssize;i++)
ans=ans+ansnum[i];
printf("%d\n",ans);
}
return 0;
}
例4.9整除问题
#include<stdio.h>
int prime[1010];
int primesize;
bool mark[1010];
void init()
{
for(int i=1;i<=1000;i++)
mark[i]=false;
primesize=0;
for(int i=2;i<=1000;i++)
{
if(mark[i]==true) continue;
prime[primesize++]=i;
for(int j=i*i;j<=1000;j=j+i)
mark[j]=true;
}
}
int cnt1[1010];
int cnt2[1010];
int main()
{
init();
int n,a;
while(scanf("%d%d",&n,&a)==2)
{
for(int i=0;i<primesize;i++)
cnt1[i]=cnt2[i]=0;
for(int i=0;i<primesize;i++)
{
int t=n;
while(t)
{
cnt1[i]=cnt1[i]+t/prime[i];
t=t/prime[i];
}
}
int ans=123123123;
for(int i=0;i<primesize;i++)
{
while(a%prime[i]==0)
{
cnt2[i]++;
a=a/prime[i];
}
if(cnt2[i]==0)
continue;
if(cnt1[i]/cnt2[i]<ans)
ans=cnt1[i]/cnt2[i];
}
printf("%d\n",ans);
}
return 0;
}
练:约数的个数
#include<stdio.h>
#include<math.h>
int numofdivisor(int x)
{
int ans=0;
int i;
if(x==1)
return 1;
for(i=1;i*i<x;i++)
{
if(x%i==0)
ans=ans+2;
}
if(i*i==x)
ans++;
return ans;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int x;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
printf("%d\n",numofdivisor(x));
}
}
return 0;
}