Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7833 Accepted Submission(s): 2539
Problem Description
读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
Input
测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即火星表示法的A+B的值。
Sample Input
1,0 2,1 4,2,0 1,2,0 1 10,6,4,2,1 0 0
Sample Output
1,0,1 1,1,1,0 1,0,0,0,0,0
/*
Name: 火星A+B
Copyright:
Author: 火星十一郎
Date: 25-07-25 08:14
Description:
*/
/*long long的十进制为20位*/
#include<stdio.h>
#include<string.h>
#include<math.h>
/*
不必用素数定理也可估算出1到n的素数个数小于n/2
因为至少去掉所有 偶数,或者开平方 找到可能的最大素数
*/
#define N 10000
int vis[N],prim[26],ans[30];//全局数组自动赋值为0
int k1,k2;
void is_prim()//不能与数组名同名
{
int m=(int)sqrt(N+0.5);
int c=0,i,j;
memset(vis,0,sizeof(vis));
for(i=2;i<=m;i++)
if(!vis[i])
{
prim[c++]=i;
//printf("%d\n",prim[0]);
for(j=i*i;j<=N;j+=i)
vis[j]=1;
}
}
void add_output(int *temp1,int *temp2)
{
int i,j;
int len=k1>k2?k1:k2;
memset(ans,0,sizeof(ans));
//printf("%d\n",len);
for(i=0,j=0;i<len;i++)
{
ans[i]+=temp1[i]+temp2[i];
if(ans[j]>=prim[i])
{
ans[i+1]+= ans[i]/prim[i];
ans[i]%=prim[i];
//printf("%d\n",prim[i]);
j++;
}
else
j++;
/*
刚开始没加else
代码不对,因为若执行了if里的j++;则有继续执行了for循环体里的j++
*/
}
if(ans[len]!=0)
len++;
for(i=len-1;i>=1;i--)
printf("%d,",ans[i]);
printf("%d\n",ans[0]);
}
int main()
{
char str1[100],str2[100];
int temp1[100]={0},temp2[100]={0};
int i,j; int temp,len1,len2;
is_prim();
prim[0]=2;
/*
for(i=0;i<26;i++)
printf("%d ",prim[i]);
printf("\n");
/*测试后发现,N值太小(125)
改过后 prim[0]=1;
所以必须加上prim[0]=2;
*/
while(1)
{
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
memset(temp1,0,sizeof(temp1));
memset(temp2,0,sizeof(temp2));
scanf("%s %s",str1,str2);
k1=k2=0;
if(str1[0]=='0'&&str2[0]=='0')
break;
len1=strlen(str1);
len2=strlen(str2);
//为防止最后一个字符未被转化为整形
str1[len1]=',';
str2[len2]=',';
len1++;
len2++;
//转化为整形
for(i=0,temp=0,k1=0;i<=len1;i++)
{
if(str1[i]==',')
{
temp1[k1++]=temp;
temp=0;
continue;
}
temp=temp*10+str1[i]-'0';
}
for(i=0,temp=0,k2=0;i<=len2;i++)
{
if(str2[i]==',')
{
temp2[k2++]=temp;
temp=0;
continue;
}
temp=temp*10+str2[i]-'0';
}
//for(i=0;str1[i]!='\0';i++)
//逆置 ,j<len1-1不能加等号,因为最后人为加了逗号
for(i=0,j=k1-1;j>=i;i++,j--)
{
temp=temp1[j];//temp需要时char
temp1[j]=temp1[i];
temp1[i]=temp;
}
for(i=0,j=k2-1;j>=i;i++,j--)//逆置
{
temp=temp2[j];
temp2[j]=temp2[i];
temp2[i]=temp;
}
add_output(temp1,temp2);
}
return 0;
}
做这道题时,原来两个temp没清零,结果同一组数据,每次结果不一样
看来,变量一定要赋初值,数组一定清空
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.