码迷,mamicode.com
首页 > 其他好文 > 详细

大数减法

时间:2018-08-10 12:23:12      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:情况   大数   pre   cstring   string   int   printf   赋值   strlen   

#include <cstdio>
#include <cstring>
#include <cstdlib>

// 功能:实现两个大数减法运算
// 参数:source1--被减数
//       source2--减数
//       result --计算结果
// 返回值:计算结果为正数,返回‘+‘,否则返回‘-‘
char Minus(char *source1, char *source2, char *result)
{
    int length1 = strlen(source1); // 被减数的长度
    int length2 = strlen(source2); // 减数的长度
    int i, j, k = 0;
    int temp; // 临时存放位相减的结果
    int bit = 0; // 借位,1表示需要借位,0表示不需要借位
    char ch; // 用于交换
    
    for (i = length1 - 1, j = length2 - 1; i >= 0 && j >= 0; --i, --j)
    {
        // 计算两个位之间的差值,同时要考虑借位
        temp = (source1[i] - 0) - (source2[j] - 0) - bit;
        
        if (temp < 0) // 需要借位
        {
            bit = 1;
            result[k++] = temp + 10 + 0;
        }
        else// 不需要借位
        {
            bit = 0;
            result[k++] = temp + 0;
        }
    }
    
    while (i >= 0) // length1 > length2的情况,结果为正数,将剩余数据赋值给计算结果数组
    {
        temp = source1[i--] - 0 - bit;
        if (temp < 0) // 需要借位
        {
            bit = 1;
            result[k++] = temp + 10 + 0;
        }
        else
        {
            bit = 0;
            result[k++] = temp + 0;
        }
    }
    
    while (j >= 0)// length1 < length2的情况,结果为负数,将剩余数据赋值给计算结果数组
    {
        temp = 10 - bit - (source2[j--] - 0);
        result[k++] = temp + 0;
    }
    
    // 对仍有进位的情况考虑,主要分两种:一种是strlen(p1)<strlen(p2),另一种是p1-p2<0,这两种情况bit为1
    if (bit == 1)
    {
        // 最低位肯定不会被借位,所以不需要减去借位
        // 只会向高位借位
        result[0] = 10 - (result[0] - 0) + 0;
        for (i = 1; i < k; i++)
        {
            result[i] = 10 - (result[i] - 0) - bit + 0;
        }
    }
    
    for (i = k - 1, j = 0; i >= j; --i, ++j)
    {
        ch = result[i];
        result[i] = result[j];
        result[j] = ch;
    }
    result[k] = \0;
    
    if (bit == 1)
    {
        return -;
    }
    else
    {
        return +;
    }
}

int main()
{
    char source1[1000];
    char source2[1000];
    char result[1001];
    char op;
    int NNN;
    scanf("%d",&NNN);
    while(NNN--){
    scanf("%s%s", source1, source2);
    op = Minus(source1, source2, result);
    
    if (op == -)
    {
        printf("-");
    }
    printf("%s\n", result);
    }
    return 0;
}

 

大数减法

标签:情况   大数   pre   cstring   string   int   printf   赋值   strlen   

原文地址:https://www.cnblogs.com/xiao-xue-di/p/9454243.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!