http://acm.hdu.edu.cn/showproblem.php?pid=1230
不难,就是题目有点复杂,下面我的代码(ac):
#include<stdio.h>
#include<math.h>
#include<memory.h>
int a[26],b[26],c[26],d[27];//c数组存放素数
int judge(int a)
{
for(int i=2;i<a;i++)
if(a%i==0)
return 0;
return 1;
}
void get()//找出从2开始的25个素数
{
int j=1;
for(int i=2;i<100 && j<26;i++)
if(judge(i)==1)
{
c[j]=i;
j++;
}
}
int max(int len1,int len2)//找最大值
{
if(len1>len2)
return len1;
else
return len2;
}
int main()
{
int m=1;
int len1=1,len2=1,len3,lenth;//len1表示a中所有数字的长度,len2表示b中所有数字的长度,len3表示d的
int i,j,k=1,tag;//tag标志有无进位
char ch;
//freopen("in.txt","r",stdin);
get();
while(1)
{
k=1;
tag=0;
len1=1,len2=1;
memset(d,0,sizeof(d));
while(scanf("%d%c",&a[len1],&ch)!=EOF && ch!=' ')
len1++;
if(len1==1 && a[1]==0)
break;
while(scanf("%d%c",&b[len2],&ch)!=EOF && ch!='/n')
len2++;
if(len2==1 && a[1]==0)
break;
i=len1,j=len2;
len3=max(len1,len2)+1;
lenth=len3;
while(i>0 && j>0)
{
m=c[k];
if(tag==0)
d[lenth]=a[i]+b[j];
else
d[lenth]=a[i]+b[j]+1;
if(d[lenth]>=m)
{
d[lenth]-=m;
tag=1; //tag=1表示有进位
}
else
tag=0;
i--;
j--;
lenth--;
k++;
}
if(i>0)
{
while(i>0)
{
m=c[k++];
if(tag==1)
d[lenth]=a[i]+1;
else
d[lenth]=a[i];
if(d[lenth]>=m)
{
d[lenth]-=m;
tag=1;
}
else
tag=0;
lenth--;
i--;
}
}
if(j>0)
{
while(j>0)
{
m=c[k++];
if(tag==1)
d[lenth]=b[j]+1;
else
d[lenth]=b[j];
if(d[lenth]>=m)
{
d[lenth]-=m;
tag=1;
}
else
tag=0;
lenth--;
j--;
}
}
if(tag==1)
d[lenth]=1;
for(i=1;i<len3;i++)
if(d[i]>0)
break;
for(;i<len3;i++)//输出
printf("%d,",d[i]);
printf("%d/n",d[len3]);
}
//fclose(stdin);
return 0;
}