1,0,1
1,1,1,0
1,0,0,0,0,0
代码AC,欢迎参考(zoj系统这题判断退出的条件是 a和b同时为0,而题目是或,所以大家注意了,不然总是答案错误 50分,HDU和九度是尊重原题的)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 25
int prime[N];
void findPrime() {
int i, j, n = 1;
for(i=3; ; i++) {
int flag = 1;
for(j=2;j<=sqrt((float) i);j++) {
if(i % j == 0) {
flag = 0;
break;
}
}
if(flag) {
prime[n] = i;
if(n == N-1)
break;
else
n++;
}
}
}
//num:统计火星数字位数
int calNum(char *s) {
int i=0, num=1;
while(s[i]) {
if(s[i] == ',')
num++;
i++;
}
return num;
}
int main() {
//freopen("in.txt","r",stdin);
prime[0] = 2;
findPrime();
char s1[3*N-1], s2[3*N-1];
char s[] = ",";
char *result =NULL;
int len1, len2, len, i;
while(scanf("%s %s",s1,s2) != EOF) {
//zoj系统这题判断退出的条件是 a和b同时为0,而题目是或,
//所以大家在zoj上提交时,
//将strcmp(s1,"0")==0 || strcmp(s2,"0")==0
//改为 strcmp(s1,"0")==0 && strcmp(s2,"0")==0
//不然总是答案错误 50分
if(strcmp(s1,"0")==0 || strcmp(s2,"0")==0)
break;
int a[N]={0}, b[N]={0}, sum[N+1]={0};
len1 = calNum(s1);
len2 = calNum(s2);
len = max(len1,len2); //在vc6.0时max改为__max,在oj提交时使用max;
i=len1-1;
result = strtok(s1,s);
while(result != NULL) {
sscanf(result,"%d",&a[i]);
result = strtok(NULL,s);
i--;
}
i=len2-1;
result = strtok(s2,s);
while(result != NULL) {
sscanf(result,"%d",&b[i]);
result = strtok(NULL,s);
i--;
}
int tmp;
for(i=0; i<len; i++) {
tmp = sum[i];
sum[i] = (tmp + a[i] + b[i]) % prime[i];
sum[i+1] = (tmp + a[i] + b[i]) / prime[i];
}
i = len;
if(sum[len] == 0)
i--;
for(; i>0; i--) {
printf("%d,",sum[i]);
}
printf("%d",sum[i]);
printf("\n");
}
return 0;
}