http://ac.jobdu.com/problem.php?pid=1016

来源:互联网 发布:查士丁尼瘟疫 知乎 编辑:程序博客网 时间:2024/05/01 20:23
题目描述:
    读入两个不超过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


[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<memory.h>  
  4. #include<algorithm>  
  5. #include<cstring>  
  6. #include<cmath>  
  7. #include<cstdlib>  
  8. using namespace std;  
  9. int prime[70];  
  10. int a[70];  
  11. int b[70];  
  12. int c[70];  
  13. bool isPrime(int n){  
  14.     int q = sqrt(n);  
  15.     for(int i=2;i<=q;++i){  
  16.         if(n%i==0){  
  17.             return false;  
  18.         }  
  19.     }  
  20.     return true;  
  21. }  
  22. int main(){  
  23.   
  24.     //freopen("in.txt", "r", stdin);  
  25.   
  26.     int k=1;  
  27.     for(int i=2;1;i++){  
  28.         if(isPrime(i)){  
  29.             prime[k++] = i;  
  30.         }  
  31.         if(k==68)  
  32.             break;  
  33.     }  
  34.   
  35.     string s1, s2;  
  36.     while(true){  
  37.         memset(a, 0, sizeof(a));  
  38.         memset(b, 0, sizeof(b));  
  39.         memset(c, 0, sizeof(c));  
  40.         cin>>s1>>s2;  
  41.         int len1 = s1.length();  
  42.         int k = 1;  
  43.         int t;  
  44.         bool iszero = true;  
  45.         for(int i=len1-1;i>=0;i-=2){  
  46.   
  47.             t = s1[i]-'0';  
  48.             while(i-1>=0 && s1[i-1]!=',')  
  49.                 t  = (s1[--i]-'0')*10+t;  
  50.             a[k++] = t;  
  51.             if(a[k-1]!=0)  
  52.                 iszero = false;  
  53.         }  
  54.         if(iszero)  
  55.             break;  
  56.         iszero = true;  
  57.         int len2 = s2.length();  
  58.         k = 1;  
  59.   
  60.         for(int i=len2-1;i>=0;i-=2){  
  61.             t = s2[i]-'0';  
  62.             while(i-1>=0 && s2[i-1]!=',')  
  63.                 t = (s2[--i]-'0')*10+t;  
  64.             b[k++] = t;  
  65.             if(b[k-1]!=0)  
  66.                 iszero = false;  
  67.         }  
  68.         if(iszero)  
  69.             break;  
  70.   
  71.         int len = max((len1-1)/2+1, (len2-1)/2+1);  
  72.   
  73.         for(int i=1;i<=len+1;++i){  
  74.   
  75.             c[i] += a[i]+b[i];  
  76.             if(c[i]>=prime[i]){  
  77.                 c[i+1] = c[i]/prime[i];  
  78.                 c[i] = c[i]%prime[i];  
  79.             }  
  80.         }  
  81.   
  82.         bool flag = true;  
  83.         for(int i =len+1;i>1;i--){  
  84.             if(flag){  
  85.                 if(c[i]==0)  
  86.                     continue;  
  87.                 else  
  88.                     flag = false;  
  89.             }  
  90.             printf("%d,", c[i]);  
  91.         }  
  92.         printf("%d\n", c[1]);  
  93.   
  94.     }  
  95.   
  96.     //fclose(stdin);  
  97.     return 0;  
  98. }  

原创粉丝点击