华为机试—大数相减

题目:大数相减

输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果。

备注:1、两个整数都是正整数,被减数大于减数 示例:


输入:1000000000000001       1

输出:1000000000000000


#include <stdio.h>    
#include <string.h>    
 
#define MAX 100      
//100位大数相减   

int bigNumSub(char a[],char b[],char sub[])    
{  
    int i=0;    
    int c=0;//判断是否够减,0够减,1不够减 
  
    //清0  
    char m[MAX]={0};  //被减数大于减数
    char n[MAX]={0};  //减数
    memset(sub,0,100);    
        
    //字符串反转且字符串变数字    
    int lenA=strlen(a);    
    int lenB=strlen(b);  
             
    for (i=0;i<lenA;i++)    
    {    
       m[i]=a[lenA-i-1]-'0';  
	   //printf("%d",m[i]);   
    } 
    for (i=0;i<lenB;i++)    
    {    
       n[i]=b[lenB-i-1]-'0';
	   //printf("%d",n[i]); 
    }    
	
    //位运算:够减不借位,不够减借位,并且后一位减一   
    for (i=0;i<lenA;i++)    
    {  
		c=(m[i]-n[i])<0?1:0;
		sub[i]=m[i]+10*c-n[i]+'0';//加'0'转换
		if(i+1==lenA)
			break;
		m[i+1]-=c;
    } 

    return lenA;   
}     
  
  
void print(char sub[],int lenA)    
{    
    int i;
	int k;//第一个不为0的数字
 
    for(i=lenA-1; i>=0; i--)    
    { 
		if(sub[i]!='0'){
			k=i;
			break;
		}
	}
	for(i=k;i>=0;i--){
        printf("%c",sub[i]);    
    }     
}   
  
int main()    
{   
    char a[MAX];    
    char b[MAX];    
    char sub[MAX];    
    puts("input a:");    
    gets(a);    
    puts("input b:");    
    gets(b); 
    print(sub,bigNumSub(a,b,sub));   
	printf("\n");
    return 0;    
}    

测试结果,可能不周全,欢迎查漏补缺:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值