火星A+B

题目描述:
    读入两个不超过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,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
样例输出:
1,0,1
1,1,1,0
1,0,0,0,0,0

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cmath>
  5 #include <cctype>
  6 #include <cstring>
  7 
  8 #include <vector>
  9 #include <deque>
 10 #include <list>
 11 #include <map>
 12 #include <set>
 13 #include <stack>
 14 #include <queue>
 15 #include <algorithm>
 16 #include <string>
 17 
 18 
 19 #define MAXD 99999999
 20 using namespace std;
 21 
 22 
 23 
 24 int prim[100];
 25 
 26 
 27 int isprim(int n)
 28 {
 29     int k=(int)sqrt(double(n));
 30     int i;
 31 
 32     for(i=2;i<=k;i++)
 33     {
 34         if(n%i==0)
 35             return 0;
 36     }
 37 
 38     return 1;
 39 }
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 int main()
 48 {
 49 
 50 int i,j,k;
 51 
 52 int n;
 53 
 54 k=0;
 55 
 56 for(i=2;i<150;i++)
 57 {
 58 
 59     if(isprim(i))
 60     {prim[k++]=i;}
 61 }
 62 
 63 
 64 
 65 char a[100],b[100];
 66 
 67 
 68 while(scanf("%s %s",a,b)!=EOF)
 69 {
 70     getchar();
 71 
 72 
 73     if(strcmp(a,"0")==0)
 74         break;
 75 
 76     if(strcmp(b,"0")==0)
 77         break;
 78 
 79 
 80 
 81 
 82 
 83     int aa[100],bb[100];
 84 
 85     int len1=0;
 86 
 87 
 88     for(i=0;a[i];)
 89     {
 90 
 91         if(isdigit(a[i]))
 92         {int temp=0;
 93 
 94         while(a[i]&&isdigit(a[i]))
 95         {
 96             temp*=10;
 97             temp+=a[i]-'0';
 98             i++;
 99 
100         }
101 
102 
103         aa[len1++]=temp;
104 
105         }
106         else
107             i++;
108     }
109 
110 
111     int len2=0;
112 
113     for(i=0;b[i];)
114     {
115         if(isdigit(b[i]))
116         {
117             int temp=0;
118 
119         while(b[i]&&isdigit(b[i]))
120         {
121             temp*=10;
122             temp+=b[i]-'0';
123             i++;
124 
125         }
126 
127 
128         bb[len2++]=temp;
129 
130         
131         }
132         else
133             i++;
134     }
135 
136     
137 
138 
139     
140 
141     len1--;
142     len2--;
143 
144 
145     int c[100];
146 
147     int len3=99;
148 
149 
150     int temp=0;
151 
152     int fag=0;
153 
154 
155 
156     while((len1>=0)&&(len2>=0))
157     {
158 
159         temp+=aa[len1]+bb[len2];
160 
161         c[len3--]=temp%prim[fag];
162 
163 
164         temp/=prim[fag];
165 
166         fag++;
167 
168         len1--;
169         len2--;
170     }
171 
172 
173 
174 
175     while(len1>=0)
176     {
177         temp+=aa[len1];
178         c[len3--]=temp%prim[fag];
179 
180 temp/=prim[fag];    
181     fag++;
182         len1--;
183 
184     }
185 
186     while(len2>=0)
187     {
188         temp+=bb[len2];
189         c[len3--]=temp%prim[fag];
190 
191         temp/=prim[fag];
192 
193         fag++;
194         len2--;
195 
196     }
197 
198 
199     
200     while(temp)
201     {
202         c[len3--]=temp%prim[fag];
203 
204 
205         temp/=prim[fag];
206 
207         fag++;
208     }
209 
210 
211     int tag=0;
212 
213 
214 
215     for(i=len3+1;i<100;i++)
216     {
217 
218         if(tag==0)
219         {
220             cout<<c[i];
221             tag=1;
222 
223         }
224         else
225         {cout<<','<<c[i];}
226     }
227 
228     cout<<endl;
229 }
230 
231 
232 
233 
234         
235 
236 
237 
238 
239     
240         
241 
242 
243 
244 
245 
246 
247 
248 
249 
250 
251             
252 
253 
254 
255 
256                 
257 
258 
259 
260     return 0;
261 }

 

posted @ 2012-05-30 20:19  cseriscser  阅读(498)  评论(0编辑  收藏  举报