题目1207:质因数的个数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:7733
解决:2510
题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出:
对于每组数据,输出N的质因数的个数。
样例输入:
120
样例输出:
5
提示:
注意:1不是N的质因数;若N为质数,N是N的质因数。
来源:
代码:
#include <stdio.h>
#include <string.h>
bool mark[100001];
int prime[100001];
int primeSize;
void init(){
int i;
for(i=2;i<=1000000;i++){
mark[i]=false;
}
primeSize=0;
for(i=2;i<=1000000;i++){
if(mark[i]==true) continue;
mark[i]=false;
int j;
prime[primeSize++]=i;
for(j=i*i;j<=1000;j+=i){
mark[j]=true;
}
}
}
int main(){
init();
int n;
while(scanf("%d",&n)!=EOF){
int ansPrime[30];
int ansSize=0;
int ansNum[30];
int i;
for(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/=prime[i];
}
ansSize++;
if(n==1) break;
}
}
if(n!=1){
ansPrime[ansSize]=n;
ansNum[ansSize]=1;
}
int ans=0;
for(i=0;i<ansSize;i++){
ans+=ansNum[i];
}
printf("%d\n",ans);
}
return 0;
}
题目1104:整除问题
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:5331
解决:1789
题目描述:
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出:
一个整数.
样例输入:
6 10
样例输出:
1
来源:
代码:
#include <stdio.h>
#include <string.h>
bool mark[1010];
int prime[1010];
int primeSize;
void init(){
int i;
for(i=1;i<=1000;i++){
mark[i]=false;
}
primeSize=0;
for(i=2;i<=1000;i++){
if(mark[i]==true) continue;
mark[i]=false;
prime[primeSize++]=i;
int j;
for(j=i*i;j<=1000;j+=i){
mark[j]=true;
}
}
}
int cnt[1010];
int cnt2[1010];
int main(){
int n,a;
init();
while(scanf("%d%d",&n,&a)!=EOF){
int i;
for(i=0;i<primeSize;i++)
cnt[i]=cnt2[i]=0;
for(i=0;i<primeSize;i++){
int t=n;
while(t){
cnt[i]+=t/prime[i];
t=t/prime[i];
}
}
int ans=123123123;
for(i=0;i<primeSize;i++){
while(a%prime[i]==0){
cnt2[i]++;
a/=prime[i];
}
if(cnt2[i]==0) continue;
if(cnt[i]/cnt2[i]<ans){
ans=cnt[i]/cnt2[i];
}
}
printf("%d\n",ans);
}
return 0;
}