目录
大家好,这是一个高精度加法竖式模拟器。
输入格式看样例。
输入:
12345 12345
思路:
按照手算竖式的方法来。
可是这样的话,一不小心就会变成这样:
所以,
得让数组倒序存储。
代码片段:
for(int i=0;i<lena/2;i++) //将数字逆序存储
{
int temp=a[i];
a[i]=a[lena-i-1];
a[lena-i-1]=temp;
}for(int i=0;i<lenb/2;i++)
{
int temp=b[i];
b[i]=b[lenb-i-1];
b[lenb-i-1]=temp;
}
问题又来了,进位往哪存呢?
例如这种情况:
这显然是不对的。
为了解决这个问题,代码需要这样写:
int c[1001]={}; //进位
那么,加法进位值的代码就可以这么写:
for (int i = 0; i < max(lena,lenb); i++)//进位
{
c[i+1]=(a[i]+b[i])/10%10;
}
那如果a[i]+b[i]+c[i]>=10呢?
所以,代码还需要改进,例如这样(我让结果也在这个模块里运算了):
for (int i = 0; i < max(lena,lenb); i++)//进位
{
c[i+1]=(a[i]+b[i])/10%10;
}
for (int i = 0; i <= max(lena,lenb)+1; i++)
{
if ((a[i]+b[i])%10+c[i]>=10)
{
s[i]=(a[i]+b[i])%10+c[i]-10;
c[i+1]++;
}
else
{
s[i]=(a[i]+b[i])%10+c[i];
}
}
别忘了,这可是个竖式生成器,得有输出!
可是setw()不能应用在数组上,怎么办呢?
解决办法:
for (int i = 0; i < 30-count; i++)/*实现与setw()相近的功能*/
{
cout<<" ";
}
在加亿点点细节······
完整代码:
#include<bits/stdc++.h>
using namespace std;
void shushijia(string a1,string b1){//需要优化
int a[1001]={},b[1001]={},c[1001]={},s[1002]={};
int lena=a1.length(),lenb=b1.length();
for(int i = 0; i < lena; i++){ //string转换为int[array]
a[i]=a1[i]-'0';
}for(int i = 0; i < lenb; i++){
b[i]=b1[i]-'0';
}
for(int i=0;i<lena/2;i++) //将数字逆序输出
{
int temp=a[i];
a[i]=a[lena-i-1];
a[lena-i-1]=temp;
}for(int i=0;i<lenb/2;i++) //将数字逆序输出
{
int temp=b[i];
b[i]=b[lenb-i-1];
b[lenb-i-1]=temp;
}
cout<<setw(30)<<a1;
cout<<endl;
cout<<"+"<<setw(29)<<b1;
cout<<endl;
for (int i = 0; i < max(lena,lenb); i++)//进位
{
c[i+1]=(a[i]+b[i])/10%10;
}for (int i = 0; i <= max(lena,lenb)+1; i++)
{
if ((a[i]+b[i])%10+c[i]>=10)
{
s[i]=(a[i]+b[i])%10+c[i]-10;
c[i+1]++;
}
else
{
s[i]=(a[i]+b[i])%10+c[i];
}
}
cout<<"--------------------------------"<<endl;
int count;
if (a[max(lena,lenb)]+b[max(lena,lenb)]>=10)
{
count=max(lena,lenb)+1;
}
else
{
count=max(lena,lenb);
}
for (int i = 0; i < 30-count; i++)/*实现与setw()相近的功能*/
{
cout<<" ";
}
if (a[lena-1]+b[lenb-1]>=10)
{
for (int i = max(lena,lenb);i>=0;i--)
{
cout<<s[i];
}
}else{
for (int i = max(lena,lenb)-1; i>=0; i--)
{
cout<<s[i];
}
}
}
int main(){
string a1,b1;
cin>>a1>>b1;
if(a1.length()>b1.length()){
shushijia(a1,b1);
}
else{
shushijia(b1,a1);
}
return 0;
}
麻烦点赞评论收藏吧~~~