首页 > 代码库 > 华为机试—大数相减

华为机试—大数相减

题目:大数相减

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

备注: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;    
}    

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

技术分享


华为机试—大数相减