c++高精加法

总体思路:模拟竖式计算

首先,我们无法确定输入数字的大小,因此,我们使用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版权协议,转载请附上原文出处链接和本声明。