超数据范围(A-B)相减

用数组模拟(A-B)(超数据范围) 大数相减

用数据来模拟两个超出数据范围的减法,下面给小伙伴们上去代码,如果有错误,欢迎来指正哦,

//大数相减; 
#include<stdio.h>
#include<string.h>
int main()
{
    char s1[10001];
    char s2[10001];
    int a1[10001];
    int a2[10001];
    int ans[10001];
    int n;//为了实现'大数',数组开的比较大,没用到的位也要初始化为0
    memset(ans,0,sizeof(ans));
    memset(a2,0,sizeof(a2));
    memset(a1,0,sizeof(a1));
    scanf("%d",&n);//多组输入
    while(n--)
    {
        scanf("%s%s",s1,s2);
        {
        //每计算一次后需重置
            memset(ans,0,sizeof(ans));
            memset(a2,0,sizeof(a2));
            memset(a1,0,sizeof(a1));
            int i,k=0;
            int len1=strlen(s1);
            for(i=len1-1; i>=0; i--)
            {
                a1[k++]=s1[i]-'0';//存储每一位数字
            }
            k=0;
            for(i=strlen(s2)-1; i>=0; i--)
            {
                a2[k++]=s2[i]-'0';//如上
            }
            int tmp=0;
            for(i=10001;i>=0;i--){
            	if(a1[i]==a2[i]) continue;
            	else if(a1[i]>a2[i]) break;
            	else if(a1[i]<a2[i]){
				 tmp=1;break;}
			}
			int swp=0;
			if(tmp==1){
				for(i=0;i<10001;i++){
					swp=a1[i];
					a1[i]=a2[i];
					a2[i]=swp;
				}
				printf("-");
			}
			tmp=0;
			for(i=0;i<=10000;i++){
				if(a1[i]<a2[i]){
					a1[i+1]--;
					ans[i]=a1[i]-a2[i]+10;
				}
				else{
					ans[i]=a1[i]-a2[i];
				}
			}

            int flag=0;//输出(注意前导0)
            for(i=1000; i>=0; i--)
            {
                if(ans[i]!=0)
                 flag=1;
                if(flag==1)
                printf("%d",ans[i]);
            }//考虑'0+0'的特殊情况:
            if(flag==0)
            printf("0");
            printf("\n");
        }
    }
    return 0;
}

上一篇博文已经说明了前面的代码,解释了相应的作用,本文就不再过多的解释了,直接跳转到int tmp=0;定义tmp变量这个位置。

			int tmp=0;
            for(i=10001;i>=0;i--){
            	if(a1[i]==a2[i]) continue;
            	else if(a1[i]>a2[i]) break;
            	else if(a1[i]<a2[i]){
				 tmp=1;break;}
			}

这个代码段,来断定a1[]和a2[]的大小的,如果a1[]<a2[]让两者交换数据,如果a1[]>=a2[]则不做处理,tmp就是一个标志的作用。下一个代码段就是a1[]和a2[]交换数据的,不做过多的解释了。
接下来就是怎么实现两者相减的,

			for(i=0;i<=10000;i++){
				if(a1[i]<a2[i]){//判断是否会产生借位的情况
					a1[i+1]--;//产生借位了,下一位减1;
					ans[i]=a1[i]-a2[i]+10;//产生借位了,正在计算的位置+10
				}
				else{
					ans[i]=a1[i]-a2[i];//不产生进位,正常相减;
				}
			}

我已经做好的相应的注释,最后倒序输出就可以了,本文到这也快要结束了,大家可以期待下次的内容哦。拜拜。
注释:如有错误,请指正,如有雷同请私信,本文作者原载,请不要直接复制侵权哦!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值