【NOIP算法】大数的减法

博客探讨了如何进行大整数的减法运算,详细分析了借位处理及字符与数字之间的转换,并提供了样例输入和输出。还提到了信息学竞赛的相关课程信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

大整数的减法,求两个大的正整数相减的差

输入:共2行,第1行是被减数a,第2行是减数b(a>b).每个大整数不超过200位,不会有多余的前导零

输出:一行,即所求的差

【样例输入】

999999999999999999999999999999999999

9999999999

【样例输出】

999999999999999999999999990000000000

分析:

一、做大数的减法运算需要考虑问题

1)借位怎么处理?

2)借位后上一位怎么处理?

3)借位后本位怎么处理?

 

二、相关知识:字符‘9’,数字‘9’,如何相互转换

本质是字符ASCII运算

1)‘9’-‘0’ == 9   或者  ‘9’-48 == 9

2)9+‘0’ == ‘9’ 

 

参考代码:

#include <iostream>
#include <cstring>
using namespace std;

int main()
 {
    	//求两个不超过200位的大数的差  
	char a[200],b[200],temp[200];				
	int a1[200],b1[200],c1[200],i;
	int lena,lenb,lenc;
	
	memset(a1,0,sizeof(a1));	//将存储被减数数的大数数组值全部置0 
	memset(b1,0,sizeof(b1));	//将存储减数的大数数组值全部置0 
	memset(c1,0,sizeof(b1));	//将结果数组置0 
	
	cout<<"请输入被减数和减数:"<<endl;
	
	cin.getline(a,200); 
	cin.getline(b,200);
	
	lena = strlen(a);
	lenb = strlen(b);  
	
	//如果被减数比减数小,交换,并且将之后相减的结果 前面添加 负号
	if(lena<lenb || (lena==lenb)&&strcmp(a,b)<0)
	{
		strcpy(temp,a);
		strcpy(a,b);
		strcpy(b,temp);
		cout<<"-"; 
	} 
	
	//重新计算被减数、减数的位数 
	lena=strlen(a);
	lenb=strlen(b);
	
	//将字符数组中的大数 逆序 存储到 整形数组中
	for(i=0;i<lena;i++)
	{
		a1[lena-i]	= a[i]-48;    //存放被减数到a1数组  下标为0  不存放数据 
	} 
	for(i=0;i<lenb;i++)
	{
		b1[lenb-i] = b[i]- 48;   //存放减数b1数组   下标为0  不存放数据 
	}
	 
	i=1; 
	while(i<=lena||i<=lenb)
	{
		if(a1[i]<b1[i])	//该借位了 
		{
			a1[i]+=10;
			a1[i+1]--; 
		}
		c1[i]=a1[i]-b1[i];
		i++;
	}
	lenc=i; 	//减后结果的位数
	
	while((c1[lenc]==0)&&lenc>1)
	{
		lenc--;
	}
	
	//输出:
	for(i=lenc;i>=1;i--)
	{
		cout<<c1[i];
	} 
	cout<<endl;
    return 0;
}

 

 

报名我的信息学竞赛课(C++基础课程、NOIP算法课程、市赛、区赛集训课程),可以加微信?????联系我,注明“姓名+优快云 课程咨询”~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值