第2课 减法神童(subtract)《聪明人的游戏信息学探秘提高篇》

【问题描述】

在科学城里住着一位减法神童,他可以在一秒钟内算出两个数相减的结果。这两个数可不是普通的数字,它们是11位以上的“宠然大物”

为了证明自己神奇的计算能力,减法神童请全城的人都来出题考自己,只要答错一题他就自愿放弃“减法神童”的称号。

    你想考考减法神童吗?还是先编写一个程序帮我们算出任意两个11位以上的数相减的精确结果吧。

【输入格式】

    第1行是被减数A,第2行是减数B(A,B的位数大于11,小于200)。

【输出格式】

    A-B的结果。

【输入输出样例】

输入

输出

    样例1

5894379463257

1245648324567

4648731138690

    样例2

1245648324567

5894379463257

-4648731138690




//program p5_02
/*
第2课  减法神童(subtract)

C++ 中指针和引用的区别
https://www.runoob.com/w3cnote/cpp-difference-between-pointers-and-references.html

浅谈C++中指针和引用的区别
https://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html
*/ 
#include <bits/stdc++.h>
using namespace std;

const int maxL=200+10;

string s1,s2;//gets()函数 这个函数尽量不要用 不安全 
int lena,lenb,lenc;
int a[maxL],b[maxL],c[maxL]; 

void subtract(int a[],int lena,int b[],int lenb,int c[],int &lenc)//引用 
{
	memset(c,0,sizeof(c));
	lenc=lena;
	
	for(int i=0;i<lenc;++i)
	{
		c[i]=(a[i]-b[i]);
		
		if( c[i]<0 )
		{
			--a[i+1];//借高1位借1位 
			c[i]+=10;
		}
	}
	//cout<<"lenc="<<lenc<<endl;	
}

int main( void )
{
	cin>>s1>>s2;
	
	lena=s1.length();
	lenb=s2.length();
	
	//cout<<"lena="<<lena<<<<endl
	//cout<<lenb<<endl;
	
	//s1所表示的数比s2的情况 s1<s2
	if(lena<lenb || (lena==lenb && s1<s2)) 
	{
		swap(s1,s2);
		swap(lena,lenb);
		
		cout<<'-';
	}
	/*
	for(int i=0;i<lena;++i)
	{
		a[i]=s1[lena-i-1]-'0';
	}
	*/
	for (int i=0;i<=lena-1;i++) a[i]=s1[lena-i-1]-'0';
	for (int i=0;i<=lenb-1;i++) b[i]=s2[lenb-i-1]-'0';
	
	/*
	for(int i=0;i<lena;++i)
	{
		b[i]=s2[lena-i-1]-'0';
    }
    */
	
	subtract(a,lena,b,lenb,c,lenc);//实参 
	
	
	//删除前导0 lenc>1 如果都是0,至少要保留1位0 
	for(; lenc>1 && c[lenc-1]==0;--lenc);
	
	//结果再倒回来 
	for(int i=lenc-1;i>=0;--i)
	{
		cout<<c[i];
	}
	cout<<endl;
	
	return 0;
}



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

OpenJudge - 11:大整数减法

1169:大整数减法

信息学奥赛一本通(C++版)在线评测系统

 




 


 


 




课后习题

OpenJudge - 01:与指定数字相同的数的个数

OpenJudge - 10:大整数加法

OpenJudge - 11:大整数减法

信息学奥赛一本通(C++版)在线评测系统

信息学奥赛一本通(C++版)在线评测系统




1168:大整数加法

信息学奥赛一本通(C++版)在线评测系统

1.6编程基础之一维数组_10大整数加法

OpenJudge - 10:大整数加法

1169:大整数减法

信息学奥赛一本通(C++版)在线评测系统

1.6编程基础之一维数组_11大整数减法

OpenJudge - 11:大整数减法

1.6编程基础之一维数组

OpenJudge - OpenJudge - 题目

【例 1.6】回文数(Noip1999)

信息学奥赛一本通(C++版)在线评测系统

NOIP2003 普及组 第 4 题 P1045 麦森数(分治、高精度运算)

[NOIP2003 普及组] 麦森数 - 洛谷

NOIP2005 普及组 第 4 题 P1050 循环(高精度运算、数论、快速幂)

[NOIP2005 普及组] 循环 - 洛谷

 




信息学奥赛学习、训练、测试的顺序,思路及方法

信息学奥赛学习、训练、测试的顺序,思路及方法_dllglvzhenfeng的博客-CSDN博客

信息学奥赛 CSP-J2 CSP-S2第2轮 复赛 如何取得好成绩

信息学奥赛 CSP-J2 CSP-S2第2轮 复赛 如何取得好成绩_cps-j 第二轮试题做对几道题能拿奖-CSDN博客

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值