原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1405
分析:先打印好素数表,然后让每个素数去除输入的n就好。
我的代码:
#include<stdio.h>
#include<math.h>
#define Max 65536
struct Node{
int prime;
int num;
};
Node p[Max];
int If_P(int n)
{
int i;
for(i=2;i<=sqrt(double(n));i++)
{
if(n%i==0) return 0;
}
return 1;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int i;
p[0].prime=2;
int k=1;
for(i=3;i<Max;i++) if(If_P(i)) //储存素数。
{
p[k++].prime=i;
}
int tot=k;
k=1;
int n;
while(~scanf("%d",&n)&&n>0)
{
if(k!=1) printf("\n");
printf("Case %d.\n",k++);
for(i=0;i<tot;i++) p[i].num=0; //请空作为N的约数的素数个数
/* 枚举每个素数。
for(i=0;i<tot;i++)
{
while(n%p[i].prime==0)
{
p[i].num++;
n/=p[i].prime;
if(n<=1) break;
}
if(n<=1) break;
}
*/
int j=0;
while(n>1)
{
while(n%p[j].prime==0&&n>1) //素数是N的约数
{
n/=p[j].prime;
p[j].num++; //素数的个数加一,
}
j++;
}
for(i=0;i<tot;i++)
{
// printf("i=%d \n",i);
if(p[i].num)
{
printf("%d %d",p[i].prime,p[i].num);
break;
}
}
for(i+=1;i<=tot;i++)
{
if(p[i].num) printf(" %d %d",p[i].prime,p[i].num);
}
printf(" \n");
}
return 0;
}
总结:交了九次,前面一直WA,到了后面几次就是PE。。。o(>﹏<)o,WA是不仔细看题导致的,这题不是以-1结束,而是以非正数结束-_-!
PE是题目没说清吧,每个数后面带一个空格就好。