-
两条思路(该题解使用思路2)
1 以整数为桥梁,将读入字符串变成大整数计算,然后再输出
2.直接进行火星数字计算,对于进制k,满K进1 -
注意:
考虑用vector,当然C的数组肯定也可以,就是倒序数字麻烦233 -
AC代码
#include<vector>
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int a[233];//a[i]表示第i个素数
bool isprime(int );//如果是素数返回1
void reverse_num(vector<int> &A, string &n1);//将数字倒序存入数组
void print(vector<int>);//打印最后结果
vector<int> add(vector<int> &A, vector<int> &B);
//直接进行火星数字A+B
int main()
{
//预处理 a[i]表示第i个素数
for(int i=2,j=0;j<=26;i++)
if(isprime(i))
a[j++] = i;
while(1)
{
string n1,n2;
cin >> n1 >> n2;
if(n1[0]=='0'&&n2[0]=='0')
break;
else
{
vector<int> A, B;
reverse_num(A, n1);
reverse_num(B, n2);
vector<int> C = add(A, B);
print(C);
}//else ending
}//while ending
return 0;
}
bool isprime(int num)
{
if(num<=1)
return false;
for(int i=2;i*i<=num;i++)
if(num%i==0)
return false;
return true;
}
//直接进行火星数字求和
vector<int> add(vector<int> &A, vector<int> &B)
{
int t = 0;
vector<int> C;
for(int i=0;i<A.size()||i<B.size();i++)
{
if(i<A.size()) t += A[i];
if(i<B.size()) t += B[i];
C.push_back(t % a[i]);
t /= a[i];
}
if(t) C.push_back(1);//小心进位
return C;
}
//将数字倒序存入数组
void reverse_num(vector<int> &A, string &n1)
{
int ls1 = 0, num = 0;
int intnum1[2333]={0};
for(int i=0;i<n1.size();i++)
{
if(n1[i]!=',')
num = num*10 + n1[i]-'0';
else
{
intnum1[ls1++] = num;
num = 0;
}
}
A.push_back(num);
for(int j=ls1-1;j>=0;j--)
A.push_back(intnum1[j]);
}
void print(vector<int> C)
{
for(int i=C.size()-1;i>=0;i--)
{
printf("%d",C[i]);
if(i>0) printf(",");
}
printf("\n");
}
2020年1月25日