大数加法
基本思路:
以字符串读入,然后分解数位到数组中,然后模拟加法/乘法过程,逐个数位运算。加法和乘法的思路是类似的。
注意点(模拟加法):
(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;
}