【问题描述】
在科学城里住着一位减法神童,他可以在一秒钟内算出两个数相减的结果。这两个数可不是普通的数字,它们是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:大整数减法
1169:大整数减法
课后习题
1168:大整数加法
1.6编程基础之一维数组_10大整数加法
1169:大整数减法
1.6编程基础之一维数组_11大整数减法
1.6编程基础之一维数组
【例 1.6】回文数(Noip1999)
NOIP2003 普及组 第 4 题 P1045 麦森数(分治、高精度运算)
NOIP2005 普及组 第 4 题 P1050 循环(高精度运算、数论、快速幂)
信息学奥赛学习、训练、测试的顺序,思路及方法
信息学奥赛 CSP-J2 CSP-S2第2轮 复赛 如何取得好成绩
信息学奥赛 CSP-J2 CSP-S2第2轮 复赛 如何取得好成绩_cps-j 第二轮试题做对几道题能拿奖-优快云博客