题目地址: 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;
}
}