总体思路:模拟竖式计算
首先,我们无法确定输入数字的大小,因此,我们使用string
string a,b;
cin>>a;cin>>b;这不是废话吗
接着再定义两个整型变量用于计算输入数字的长度,之后再定义两个数组用于表示加数。
const int n=a.length(),m=b.length();//注意这里不能用sizeof()为了防止加数数组中出现杂值,需要在main外进行初始化
int i[500];int j[500];//加数 以及答案
int ans[501];同样的,也要初始化,注意这里要多一位,因为答案可能会多一位。
废话终于讲完了
接下来,我们要将输入的两个字符行变量转化成整型变量,存储在加数数组中。
for(int s=0,l=n-1;s<n&&l>=0;s++,l--)
{
i[l]=a[s]-48;
}
for(int s=0,k=m-1;s<m&&k>=0;s++,k--)
{
j[k]=b[s]-48;
}//字符转数字为了防止出现错误,在调试时我们可以增添一段调试代码:
// for(int s=0;s<n;s++)
// {
// cout<<"i"<<ends<<i[s]<<endl;
// }
// for(int s=0;s<m;s++)
// {
// cout<<"j"<<ends<<j[s]<<endl;
// }
//调试程序,现已无用我们还需要一个进位判定
int sb=0;//进位判定 多么优美的变量名
我们还需要一个变量,它是两个加数中最大的加数的长度加一,具体用处一会儿会讲
int q=max(n,m)+1; 接着是重头戏:正式加法
for(int s=0;s<q;s++)
{
ans[s]+=i[s]+j[s];//单数位相加
if(ans[s]>=10)
{
sb=1;
ans[s+1]+=sb;
sb=0;
ans[s]-=10;
}//如果大于十就进位
}没错,q就是这个用处,最大有多少位,就循环多少次。
照理来说,接下来就只需要输出了,但是我们忽略了一点:如果答案没有比加数多一位,那么第一位就会多输出一个0。
所以,最后一段程序在输出的同时还需要做到如果多输出了一个0,就去除。
int lenq=q;
while (ans[lenq]==0 && lenq>0) lenq--;
for(int s=lenq; s>=0; s--)
{
cout<<ans[s];
}//输出最后来看一下完整代码
#include <bits/stdc++.h>
using namespace std;
int i[500];int j[500];//加数
int ans[501];//答案
int main()
{
string a,b;
cin>>a;cin>>b;//输入
const int n=a.length(),m=b.length();//数组长度
int sb=0;//进位判定
/*cout<<n<<"---"<<m<<endl;调试*/
int q=max(n,m)+1;
for(int s=0,l=n-1;s<n&&l>=0;s++,l--)
{
i[l]=a[s]-48;
}
for(int s=0,k=m-1;s<m&&k>=0;s++,k--)
{
j[k]=b[s]-48;
}//字符转数字
// for(int s=0;s<n;s++)
// {
// cout<<"i"<<ends<<i[s]<<endl;
// }
// for(int s=0;s<m;s++)
// {
// cout<<"j"<<ends<<j[s]<<endl;
// }
//调试程序,现已无用
for(int s=0;s<q;s++)
{
ans[s]+=i[s]+j[s];//单数位相加
if(ans[s]>=10)
{
sb=1;
ans[s+1]+=sb;
sb=0;
ans[s]-=10;
}//如果大于十就进位
}
int lenq=q;
while (ans[lenq]==0 && lenq>0) lenq--;
for(int s=lenq; s>=0; s--)
{
cout<<ans[s];
}//输出
return 0;
}好了,以上就是高精加法的全部。
版权声明:本文为lust_qingliu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。