C语言练习4

##大数相减

#include<stdio.h>
#include<string.h>
#define MAX 1000

int subtraction(char num1[],char num2[],int sum[])
{
    int len1= strlen(num1);					//获取长度
    int len2= strlen(num2);
    int i,j,len,flag=0;
    int n2[MAX]={0};
    char *temp;                             //定义指针,用于交换数组
											//为了方便计算,把总保持数组一为较大的数组
    if(len1<len2)							//如果数组1的位数小于数组2
    {
        temp=num1;							//交换两数组
        num1=num2;
        num2=temp;
        len=len1;							//交换两数组长度
        len1=len2;
        len2=len;
        flag=1;
    }
    else if(len1==len2)						//如果两数组位数相等
    {
        for(i=0;i<len1;i++)					//逐个比较各位数大小
        {
            if(num1[i]==num2[i])
                continue;					//相等则比较下一位
       
            else if(num1[i]<num2[i])	    //如果数组一小于数组二,交换两数组位置
            {
                temp=num1;
                num1=num2;
                num2=temp;
                flag=1;						//并标记为负数
                break;
            }
        }
    }
    for(i=0,j=len1-1;i<len1;i++,j--)		//与大数相加一样,倒序操作
        {
            sum[i]=num1[j]-'0';
        }
    for (i=0,j=len2-1;i<len2;i++,j--)
        {
            n2[i]=num2[j]-'0';
        }

    len=len1>len2?len1:len2;	

    for(i=0;i<len;i++)						//相减
    {
        sum[i]=sum[i]-n2[i];
        if(sum[i]<0)						
        {
            sum[i]+=10;						//这两行是借位操作
            sum[i+1]--;
        }
    }
    for (i = len1-1; i>=0 && sum[i] == 0; i--);
        len = i+1;
    if(flag==1)
    {
         sum[len] = -1;  					// 在高位添加一个-1表示负数
         len++;
    }
    return len;   							// 返回结果的位数

}

int main()
{
    int len,i,flag;
    int sum[MAX]={0};
    char a1[]="11111111111111";
    char a2[]="99999999999999";
    len=subtraction(a1,a2,sum);
    printf("num1 %s - num2 %s=\n",a1,a2);
    if(sum[i=len-1]<0)						//判断是否为负数
    {
        printf("-");
        i--;
    }
    else if(sum[0]==NULL)					//如果为0,单独输出,并结束主函数
    {
        printf("0");
        return 0;
    }
    for(;i>=0;i--)							//倒序输出
        {
                printf("%d",sum[i]);
        }

    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值