#include<iostream>
#include<string>
using namespace std;
void AddTwoString(string &sum,string &tmp)
{
string s1(sum),s2(tmp),tmp1,result;
int step=0,m;
if(s1.size()<s2.size()) { tmp1=s1;s1=s2;s2=tmp1; }
string::reverse_iterator r1=s1.rbegin(),r2=s2.rbegin();
while(r2!=s2.rend())
{
m=(*r1-'0')+(*r2-'0')+step;
step=m/10;
result.push_back(m%10+'0');
r1++; r2++;
}
if(r1==s1.rend()&&step) result.push_back(step+'0');//!!!!!!!!!!!!
while(r1!=s1.rend())
{
m=(*r1-'0')+step;
step=m/10;
result.push_back(m%10+'0');
r1++;
}
tmp1="";
for(string::reverse_iterator r=result.rbegin();r!=result.rend();r++)
tmp1.push_back(*r);
sum=tmp1;
// cout<<s1<<"+"<<s2<<"="<<sum<<endl;
}
void MulTwoString(string &s1,string &s2,string &mul)
{
if(s1==""||s2=="") {cout<<"illegal input!"<<endl; return; }
for(string::iterator t1=s1.begin();t1!=s1.end();t1++)
if(!(*t1>='0'&&*t1<='9'))
{cout<<"s1 is illegal input!"<<endl; return; }
for(string::iterator t2=s2.begin();t2!=s2.end();t2++)
if(!(*t2>='0'&&*t2<='9'))
{cout<<"s2 is illegal input!"<<endl; return; }
string tmp,sum;
int step=0,jinwei,m,t;
if(s1.size()<s2.size()){tmp=s1;s1=s2;s2=tmp;}
// cout<<"after swap, s1="<<s1<<" s2="<<s2<<endl; //
for(string::reverse_iterator rt2=s2.rbegin();rt2!=s2.rend();rt2++)
{ tmp="";
m=(*rt2)-'0';
jinwei=0;
//t=0;
for(string::reverse_iterator rt1=s1.rbegin();rt1!=s1.rend();rt1++)
{
t=m*((*rt1)-'0')+jinwei;
jinwei=t/10;
tmp.push_back((t%10)+'0');
}
if(jinwei)tmp.push_back(jinwei+'0');
string tmp2;
for(string::reverse_iterator r2=tmp.rbegin();r2!=tmp.rend();r2++)
tmp2.push_back(*r2);
tmp=tmp2;
// cout<<"tmp="<<tmp<<endl;
if(sum=="") sum=tmp;
else{
int k=step;
while(k){ tmp.push_back('0'); k--; }
AddTwoString(sum,tmp);
}
step++;
}
mul=sum;
}
int main()
{
string s1,s2,mul;
//int step=0;
cout<<"enter two numbers:"<<endl;
cin>>s1;
cin.clear();
cin>>s2;
cout<<"s1="<<s1<<"\ns2="<<s2<<endl;
MulTwoString(s1,s2,mul);
if(mul!="")cout<<"s1*s2="<<mul<<endl;
return 0;
}
这是一个C++程序,实现了两个大整数的相加和相乘操作。程序通过逆序遍历字符串表示的大整数,进行逐位计算,并处理进位。最后将结果以字符串形式输出。
557

被折叠的 条评论
为什么被折叠?



