【大数/高精度整数】OJ NOI 11:大整数减法

11:大整数减法

总时间限制: 
1000ms
内存限制: 
65536kB
描述

求两个大的正整数相减的差。

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














本题是大整数减法,依旧是模板:

#include<stdio.h>
#include<string.h>
struct bigInteger{
	int digit[1000];
	int size;
	void init(){
		size=0;
		for(int i=0;i<1000;i++){
			digit[i]=0;
		}
	}
	void set(char str[]){
		init();
		int len=strlen(str);
		for(int i=len-1,j=0,t=0,c=1;i>=0;i--){
			t+=(str[i]-'0')*c;
			c*=10;
			j++;
			if(j==4||i==0){
				digit[size++]=t;
				j=0;
				t=0;
				c=1;
			}
		}
	}
	void output(){
		for(int i=size-1;i>=0;i--){
			if(i!=size-1){
				printf("%04d",digit[i]);
			}else{
				printf("%d",digit[i]);
			}
		}
		printf("\n");
	}
	bigInteger operator - (const bigInteger &A)const{
		//减法
		bigInteger ret;
		ret.init();
		int c=0;//借位
		int i;
		for(i=0;i<A.size;i++){
			int tmp=digit[i]-A.digit[i]-c;
			c=0;
			while(tmp<0){
				tmp+=10000;
				c++;
			}
			ret.digit[ret.size++]=tmp;
		}
		for(;i<size;i++){
			if(c!=0){
				ret.digit[ret.size++]=digit[i]-c;
				c=0;
			}else{
				ret.digit[ret.size++]=digit[i];
			}
		}
		return ret;
	} 

}a,b,c;

int main(){
	char str1[1000];
	char str2[1000];
	scanf("%s%s",str1,str2);
	a.set(str1);
	b.set(str2);
	c=a-b;
	c.output();
}
代码虽然长...但是思路比较清楚

猜你喜欢

转载自blog.csdn.net/qq_33837704/article/details/80583288
今日推荐