【模板】高精度整数之大数加法和乘法 (a+b、N的阶乘题解)

大数加法

基本思路:

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

注意点(模拟加法):

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

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

a+b

题目描述

实现一个加法器,使其能够输出a+b的值。

输入

输入包括两个数a和b,其中a和b的位数不超过1000位。

输出

可能有多组测试数据,对于每组数据,输出a+b的值

样例输入

2 6
1000000000000000000000 10000000000000000000000000000000000000000000

样例输出

8
100000000000000000000000000000000000000000000
#include<iostream>
#include<cstring>
using namespace std;
int trans(char s[],int num[])
{
	int len = strlen(s);
	for(int i=0;i<len;i++)
	{
		num[i]=s[len-1-i]-'0';
	}
	return len;
}
int main(void)
{
	char s1[1001];
	char s2[1001];
	int num1[1001]={0};
	int num2[1001]={0};//先默认为0 
	while(scanf("%s%s",&s1,&s2)!=EOF)
	{
		int len1=trans(s1,num1);
		int len2=trans(s2,num2);
		int maxlen = len1>len2?len1:len2;
		int carry=0;
		for(int i=0;i<maxlen;i++){
			int temp= num1[i]+num2[i]+carry;
			num1[i]=temp % 10;
			carry=temp/10;
		} 
		if(carry!=0)
		{
			num1[maxlen++]=carry;//这是加法,因此至多一个额外的进位 
		}
		for(int i=maxlen-1;i>=0;i--){
			printf("%d",num1[i]);
		} 
		printf("\n");
	}
	return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
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()<str2.length()) swap(str1,str2);//str1长度更长
         
        int carry = 0;
        int i;
        for(int i=str2.length();i<str1.length();i++) str2+="0";
        for(i=0;i<str1.length();i++)
        {
            int tmp = str1[i]-'0'+str2[i]-'0'+carry;
            carry = tmp/10;
            str1[i] = '0'+ tmp % 10;
        }
        if(carry!=0)
        {
            str1+="1";
        }
        reverse(str1.begin(),str1.end());
        cout<<str1<<endl;
    }
    return 0;
}

大数乘法

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

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

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

N的阶乘

本题在线链接

题目描述

 输入一个正整数N,输出N的阶乘。

输入描述

正整数N(0<=N<=1000)

输出描述

 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘

输入

4
5
15

输出

24
120
1307674368000
#include<iostream>
#include<cstring>
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<size;i++)
			{
				int temp = ans[i] * t +carry;
				ans[i] = temp % 10;
				carry = temp/10; 
			}
			while(carry!=0)
			{
				ans[size++]=carry%10;
				carry/=10;
			}
		 } 
		 for(int i=size-1;i>=0;i--) printf("%01d",ans[i]);
		 printf("\n");
	}
	return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值