华为机试—大数相减

题目:大数相减

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

备注: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
    评论
#include<stdio h> #include<string h> int main { int len1 len2 i j k t m; char str1[100] str2[100] str[100]; while scanf "%s %s" str1 str2 EOF { m 0; len1 strlen str1 ; len2 strlen str2 ; for i 0;i<len1;i++ str1[i] 48; for j 0;j<len2;j++ str2[j] 48; if len1 len2 {for i 0;i<len1;i++ { if str1[i]>str2[i] {for i len1 1 j len2 1 k 0;j> 1;i j k++ { if str1[i]<str2[j] {str1[i]+ 10;if str1[i 1]>0 str1[i 1] ;else {str1[i 1] 9;str1[i 2] ;}} str[k] str1[i] str2[j]; } break; } if str2[i]>str1[i] { for i len1 1 j len2 1 k 0;j> 1;i j k++ { if str1[i]>str2[j] {str2[j]+ 10;if str2[j 1]>0 str2[j 1] ;else {str2[j 1] 9;str2[j 2] ;}} str[k] str2[j] str1[i]; } printf " " ; break; } else{for i 0;i<len1;i++ str[i] 0;break;} } t len1 1; } if len1>len2 { for i len1 1 j len2 1 k 0;j> 1;i j k++ { if str1[i]<str2[j] {str1[i]+ 10;if str1[i 1]>0 str1[i 1] ;else {str1[i 1] 9;str1[i 2] ;}} str[k] str1[i] str2[j]; } for i len1 len2 1 k len2;k<len1;i k++ { str[k] str1[i]; } t len1 1; } if len1<len2 { for i len1 1 j len2 1 k 0;j> 1;i j k++ { if str1[i]>str2[j] {str2[j]+ 10;if str2[j 1]>0 str2[j 1] ;else {str2[j 1] 9;str2[j 2] ;}} str[k] str2[j] str1[i]; } for j len2 len1 1 k len1;k<len2;j k++ { str[k] str2[j]; } printf " " ; t len2 1; } for i t;i> 1;i { if m 0 printf "%d" str[i] ; if m 0&&str[i] 0 {printf "%d" str[i] ;m++;} } if m 0 printf "0" ; printf " n" ; } return 0; }">#include<stdio h> #include<string h> int main { int len1 len2 i j k t m; char str1[100] str2[100] str[100]; while scanf "%s %s" str1 str2 EOF { m 0; len1 strlen str1 ; len2 strlen str2 ; for i 0;i<len1;i++ str1[i] 48; for j 0;j<len2;j++ str2[j] 48; if len1 len2 [更多]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值