火星A+B 2006年浙江大学计算机及软件工程研究生机试真题

来源:互联网 发布:mac 输入法切换快捷键 编辑:程序博客网 时间:2024/04/29 15:36
题目描述:
    读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
输入:
    测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即火星表示法的A+B的值。
样例输入:
1,0 2,14,2,0 1,2,01 10,6,4,2,10 0
样例输出:
1,0,11,1,1,01,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 25int 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;elsen++;}}}//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;}


0 0