a+b和a-b
来源:互联网 发布:淘宝售后客服几点上班 编辑:程序博客网 时间:2024/04/29 12:58
问题 P: a+b和a-b
时间限制: 1 Sec 内存限制: 128 MB提交: 4 解决: 2
题目描述
给你两个数a和b,让你计算a和b的和或者差。
输入
有t组数据,每组数据输入一个正数a,接着输入一个符号('+'或者'-'),再输入一个正数b。
a和b的位数都小于100位。
输出
若是'+',输出两个数之和,若是'-',输出两数之差。
样例输入
412345 + 1234512345 + 352345 - 1234512 - 123
样例输出
2469012380-10000-111
提示
注意:a和b很大,用int或者long long无法存储。
这是我看别人写的大数乘法,比葫芦画瓢写的加减法,总体来说算是比较基础的,需要注意的地方是加法进位和减法借位的操作#include<stdio.h>
#include<string.h>#include<algorithm>
using namespace std;
char s[130],r[130],sign;
int sint[130],cint[130],sum[130];
int len1,len2;void add(int flag)
{
for(int i=0;i<flag;i++)
{
sum[i]=sint[i]+cint[i];//模拟加法操作,不管有多大,该位相加时候大于10,先存起来,下面在做进位的操作
}
for(int i=0;i<flag;i++)
{
if(sum[i]>=10)
{
sum[i+1]+=sum[i]/10;//这里就是进位操作了
sum[i]%=10;
}
}
if(sum[flag]>0) flag++;//当然你需要注意的是一个3位的数加上一个1位的数,可能等于4位的数,所以要看一下较高一位是否大于0
for(int i=flag-1;i>=0;i--)
{
printf("%d",sum[i]);
}
printf("\n");
}
void cut(int flag)
{
if(flag==len1)//减法其实和加法的道理一样,这里如果是大减小肯定是大于零的,只需要注意借位的问题即可
{
for(int i=0;i<flag;i++)
{
sum[i]=sint[i]-cint[i];
}
for(int i=0;i<flag;i++)
{
if(sum[i]<0)
{
sum[i+1]--;
sum[i]+=10;
}
}
if(sum[flag-1]==0) flag--;
for(int i=flag-1;i>=0;i--)
{
printf("%d",sum[i]);
}
printf("\n");
}
else//然而到了这里就是小减去大的了,但是我们还让它用大的减去小的,然后在前面加一个负号即可
{
for(int i=0;i<flag;i++)
{
sum[i]=cint[i]-sint[i];
}
for(int i=0;i<flag;i++)
{
if(sum[i]<0)
{
sum[i+1]--;
sum[i]+=10;
}
}
if(sum[flag-1]==0) flag--;
printf("-");
for(int i=flag-1;i>=0;i--)
{
printf("%d",sum[i]);
}
printf("\n");
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s %c%s",s,&sign,r);//这里在%c前加一个空格是为了防止sign吸收输入字符串%s结尾的回车,当然很多人喜欢用getchar()吸收,具体用法自行百度
len1=strlen(s);
len2=strlen(r);int flag=len1>len2?len1:len2;//flag记录两者最长的那个字符长度,是为了在减法运算的时候,让大的减去小的,这样就不会在用数组模拟的时候出现麻烦
int j=0;
memset(sint,0,sizeof(sint));
memset(cint,0,sizeof(cint));
memset(sum,0,sizeof(sum));//记得每次要清零哦,有个好习惯哈
for(int i=len1-1;i>=0;i--,j++)
{
sint[i]=s[j]-'0';
}
j=0;
for(int i=len2-1;i>=0;i--,j++)
{
cint[i]=r[j]-'0';
}
if(len1==len2)
{
if(strcmp(s,r)==1) flag=len1;//即使是在减法里两个字符串的长度一样,但是依旧无法判断大小,但是我们学过#include<string.h>头文件里得到strcmp()函数,用来比较两个字符串的大小,这是一位一位比较的,比如abc就比ABCD大,所以刚开始要比较一下字符串的长度
else flag=len2;
}
if(sign=='+') add(flag);
else cut(flag);
}
return 0;
}
//若有错误,还望各位读者指出,谢谢
2 0
- a+b和a-b
- a+b和a-b
- a>b?a:b
- a[b]和b[a]区别
- (a^b)%c和(a/b)%c
- 大数 a+b 和 a-b
- alert(a&&b)和alert(a||b)
- hpu1306 大数a+b和a-b
- 交换a和b...
- 交换a和b
- A+B和C
- A+B和C
- A+B和C
- A+B和C
- A+B和C
- A+B和C
- A+B的和
- python的 a,b=b,a+b 和 a=b b=a+b 的区别
- H264(ES)如何打包成H264(PES)
- ZSTU4270 同源数
- Java后台工程师一线面试问题
- Oracle中大数据量时提高查速度的办法
- samba、nis、nfs搭建
- a+b和a-b
- Robots协议
- 子沐课堂——Mysq从入门到精通(二)
- 顶部fixed固定条遮挡下边文案
- 安卓判断是否安装了某个APP
- Android 源码开发指令解析
- Centos7安装Jenkins
- 数的分解
- android APK瘦身全面总结——如何从32.6M到13.6M