NOI / 1.6编程基础之一维数组--11:大整数减法

别等时光非礼了梦想. 提交于 2020-01-12 06:16:22

11:大整数减法

原地址

总时间限制: 1000ms 内存限制: 65536kB
描述
求两个大的正整数相减的差。

输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。
样例输入
9999999999999999999999999999999999999
9999999999999
样例输出
9999999999999999999999990000000000000
源码

#include<iostream>  
#include<cstring>  
#include<string>  
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<math.h>
#include<cstdlib>
#include<iomanip>
using namespace std;//大整数减法,跟上一道大整数加法异曲同工 
int main() {
	string str;
	int a[210],b[210],result[210]={0},deposit[210]={0};
	int a_len=0,b_len=0,len,i;
	cin>>str;
	for(i=0;i<str.length();i++){//反转的时候把0去掉,虽然不影响计算结果,但是看上去总归不习惯 
		if(str[i]!='0') break;
	}
	for(;i<str.length();i++)
		a[a_len++]=str[i]-48;//字符转整数 
	reverse(a,a+a_len);/*测试数组 
	for(i=0;i<a_len;i++)
	   cout<<a[i];
	cout<<endl;*/
	cin>>str;
	for(i=0;i<str.length();i++){
		if(str[i]!='0') break;
	}
	for(;i<str.length();i++)
		b[b_len++]=str[i]-48;
	reverse(b,b+b_len);/*测试数组 
    for(i=0;i<b_len;i++)
	   cout<<b[i];
	cout<<endl;*/
	if(a_len==0&&b_len==0){
		cout<<"0";
		return 0;
	}
	len=max(a_len,b_len);
	for(i=0;i<len;i++){
		result[i]=a[i]-b[i]-deposit[i];
		if(result[i]<0){
			result[i]+=10;//这个借位是+10,刚开始我是取反,脑袋抽筋了,小学题都不会了 
			deposit[i+1]=1;//下一位-1,因为借位了 
		}
	}
	reverse(result,result+len);//这个反转的目的是为了防止输出的时候前几位是0 
	for(i=0;i<len;i++)
		if(result[i]!='0') break;//非零才开始输出 
	for(;i<len;i++){
		cout<<result[i];
	} 
	cout<<endl;
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!