高精度整数问题(大数加法和乘法)

基本思路:

以字符串读入,然后分解数位到数组中,然后模拟加法/乘法过程,逐个数位运算。加法和乘法的思路是类似的。

注意点(模拟加法):

(1)注意要根据长度判断(可以给位数少的大数增加前导0,使得长度相等)。同时注意可能有额外进位,但是对于加法至多一位。

(2)注意为了使得位置对齐,在将字符串读入同时,需要倒序。同理,输出时对于string类要reverse(),字符串的要倒序逐个输出。

#include
#include
using namespace std;
int trans(char s[],int num[])
{
	int len = strlen(s);
	for(int i=0;ilen2?len1:len2;
		int carry=0;
		for(int i=0;i=0;i--){
			printf("%d",num1[i]);
		} 
		printf("\n");
	}
	return 0;
}
#include
#include
#include
using namespace std;
int main(void)
{
    string str1,str2;
    while(cin>>str1>>str2)
    {
        reverse(str1.begin(),str1.end());
        reverse(str2.begin(),str2.end());
        if(str1.length()

注意点(模拟乘法,不涉及大数和大数相乘):

(1)唯一与大数加法不同的是,可能有很多额外的进位,注意while语句处理。

(2)对于下面的大数乘法求解阶乘,我们从1开始做乘法,就避免了倒序问题了。但是要注意标记当前的结果长度size。

#include
#include
using namespace std;
int main(void)
{
	int n;
	while(cin>>n)
	{
		
		int ans[10001]={0};
		ans[0]=1;
		int size=1;//表示位数
		for(int t=1;t<=n;t++)//第t次乘法 
		{
			int carry = 0;
			for(int i=0;i=0;i--) printf("%01d",ans[i]);
		 printf("\n");
	}
	return 0;
}

 

 

你可能感兴趣的:(算法基础)