[hdu]1230 火星A+B
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230
解题思路:
刚开始是做法是直接把a跟b转化成十进制数,加完后再转化,最后一看是25位,数据太大存不下,只能用数组做了,用两个数组做把个位的放在数组的第一位,这样就不会考虑高位放在第一位,进位的问题了,然后把两个数组相加,每一位除以prime[i]看是否大于一,大于一就要有进位,进位为/prime[i],该位进位后剩下%prime[i];输出 时候判断去两个数组的最大长度那一位判断是否大于0,!具体实现看代码:
AC代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; char s1[505],s2[505]; int c[505],d[505]; int prime[30]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113}; int main() { int len1,len2,i,j,temp; while(scanf("%s%s",s1,s2)) { if(strcmp(s1,"0")==0&&strcmp(s2,"0")==0) break; memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); len1=strlen(s1);len2=strlen(s2); temp=1; for(i=len1-1,j=0;i>=0;i--) { if(s1[i]==',') { j++;temp=1; } else { c[j]+=(temp*(s1[i]-'0')); temp*=10; } }len1=j+1; temp=1; for(i=len2-1,j=0;i>=0;i--) { if(s2[i]==',') { j++;temp=1; } else { d[j]+=(temp*(s2[i]-'0')); temp*=10; } }len2=j+1; if(len1<len2) len1=len2; for(i=0;i<len1;i++) { c[i]+=d[i]; if(c[i]/prime[i]!=0) { c[i+1]+=(c[i]/prime[i]); c[i]%=prime[i]; } } for(i=(c[len1]==0?len1-1:len1);i>=0;i--) { printf("%d%c",c[i],i==0?'\n':','); } } return 0; }