hdu 1230 火星A+B
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1230
第i位表示的实际大小是前i 个素数的乘积那么多,(第0位表示1) 进位规则是这一位减去p[i] (例如第0位减去p[0]==2) 高以为加1 ,由于更加难进位了,所以加法先相加,然后一次进位扫描就能保证每一位在范围内。
输入输出有点麻烦,是这个题的考点吧
代码:
#include<iostream> #include<string> #include<vector> #include<cstring> #include<algorithm> using namespace std; int p[101]; vector<int> prime; int na[25]; int nb[25]; int ans[26]; void pre() { for(int i=2;i<=10;i++) if(p[i]==0) for(int j=i*i;j<=100;j+=i) p[j]=1; for(int i=2;i<=100;i++) if(p[i]==0) prime.push_back(i); } int max(int a,int b) { return a>b?a:b; } int main() { pre(); string a,b; while(cin>>a>>b) { memset(na,0,sizeof(na)); memset(nb,0,sizeof(nb)); if(a=="0"&&b=="0") break; int aa=0,bb=0; int cnta=0; int cntb=0; for(int i=0;i<a.length();i++) { if(a[i]==',') { cnta++; } else { na[cnta]=10*na[cnta]+a[i]-'0'; } } for(int i=0;i<b.length();i++) { if(b[i]==',') { cntb++; } else { nb[cntb]=10*nb[cntb]+b[i]-'0'; } } reverse(na,na+cnta+1); reverse(nb,nb+cntb+1); for(int i=0;i<25;i++) ans[i]=na[i]+nb[i]; for(int i=0;i<25;i++) if(ans[i]>=prime[i]) { ans[i]-=prime[i]; ans[i+1]+=1; } int start=0; for(int i=25;i>=0;i--) { if(ans[i]==0) continue; else { start=i; break; } } for(int i=start;i>0;i--) { cout<<ans[i]<<','; } cout<<ans[0]<<endl; } }