題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1230
火星A+B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10638 Accepted Submission(s): 3550
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
題目大意:這是我一次比賽,差這一題ak的,無奈,當時說了一句,我一個地球人,怎么知道火星a+b怎么算,比賽結束后,看了下這題是麻煩了些哈~~
把字符轉換一下,然后按照大數的思想做下去就ok了,不過我還是轉換了好久,把數字一位一位的拿出來,在倒敘相加,最后在倒着輸出來!!
詳見代碼。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int hash[9999],sum[110]; 7 char ch1[110],ch2[110]; 8 int num1[110],num2[110]; 9 int n1[110],n2[110],k1,k2; 10 11 void sushu() 12 { 13 int n,i,k=1;hash[0]=2; 14 for (n=3; n<=9999; n++) 15 { 16 17 for (i=2; i*i<=n; i++) 18 { 19 if (n%i==0) 20 break; 21 else 22 hash[k++]=n; 23 } 24 if (i*i>n) 25 hash[k++]=n; 26 } 27 } 28 29 int main () 30 { 31 sushu(); 32 while (cin>>ch1>>ch2) 33 { 34 if (strcmp(ch1,"0")==0&&strcmp(ch2,"0")==0) 35 break; 36 memset(n1,0,sizeof(n1)); 37 memset(n2,0,sizeof(n2)); 38 memset(num1,0,sizeof(num1)); 39 memset(num2,0,sizeof(num2)); 40 int len1=strlen(ch1); 41 int len2=strlen(ch2); 42 k1=0; 43 for (int i=0; i<len1; i++) 44 { 45 if (ch1[i]==',') 46 { 47 k1++; 48 continue; 49 } 50 num1[k1]=num1[k1]*10+ch1[i]-'0'; 51 } 52 k2=0; 53 for (int i=0; i<len2; i++) 54 { 55 if (ch2[i]==',') 56 { 57 k2++; 58 continue; 59 } 60 num2[k2]=num2[k2]*10+ch2[i]-'0'; 61 } 62 for (int i=k1; i>=0; i--) 63 n1[k1-i]=num1[i]; 64 for (int i=k2; i>=0; i--) 65 n2[k2-i]=num2[i]; 66 67 int K=k1>k2?k1:k2; 68 for (int i=0; i<=K; i++) 69 { 70 if (i==0) 71 sum[i]=n1[i]+n2[i]; 72 else 73 { 74 if (sum[i-1]>=hash[i-1]) 75 sum[i]=n1[i]+n2[i]+1; 76 else 77 sum[i]=n1[i]+n2[i]; 78 } 79 } 80 if (sum[K]>=hash[K]) 81 sum[++K]=1; 82 83 for (int i=K; i>=0; i--) 84 { 85 if (i==K) 86 printf ("%d",sum[i]%hash[i]); 87 else 88 printf (",%d",sum[i]%hash[i]); 89 } 90 printf ("\n"); 91 } 92 return 0; 93 }
