zoukankan      html  css  js  c++  java
  • 大数加减1——将两个数均前后倒置,以对齐最低位

    #include <stdio.h>
    
    //将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度。
    void read(int num[])
    {
        int i;
        char ch;
        for (i = 0; i<500; i++)
            num[i] = 0;
        i = 1;
        while ((ch = getchar()) != '
    ')
        {
            num[i] = ch - '0';
            i++;
            num[0]++;
        }
    }
    
    //将数据num[]中的数翻转,以便计算
    void rev(int num[])
    {
        int i, t;
        for (i = 1; i <= num[0] / 2;i++)
        {
            t = num[i];
            num[i] = num[num[0] + 1 - i];
            num[num[0] + 1 - i] = t;
        }
    }
    
    void print(int num[])
    {
        char character[11] = { "0123456789-" };//character[n]表示数字n的字符形式。character[10]='-'用于输出减法结果中的负号。
        int i;
        for (i = 1; i <= num[0]; i++)
            printf("%c", character[num[i]]);
        printf("
    ");
    }
    
    //将a[]和b[]的值相加,存储于sum[]中。
    void add(int sum[], int a[], int b[])
    {
        //flag为进位标志位。
        int i, flag = 0;
        rev(a);
        rev(b);
        for (i = 1; i <= a[0] || i <= b[0]; i++)
            sum[i] = a[i] + b[i];
    
        if (a[0] > b[0]) 
            sum[0] = a[0];
        else 
            sum[0] = b[0];
    
        for (i = 1; i <= sum[0]; i++)
        {
            sum[i] += flag;
            if (sum[i] > 9) 
            {
                sum[i] = sum[i] % 10;
                flag = 1;
            }
            else 
                flag = 0;
        }
        if (1 == flag)
        {
            sum[0] += 1;
            sum[i] = 1;
        }
        rev(sum);
        rev(a);//加法运算完之后,再将a,b翻转回来。
        rev(b);
    }
    
    void sub(int rst[], int a[], int b[])
    {
        int i;
        int flag = 0;//flag为借位标志位。
        rev(a);
        rev(b);
    
        for (i = 1; i <= a[0] || i <= b[0]; i++)
            rst[i] = a[i] - b[i];
    
        if (a[0] > b[0]) 
            rst[0] = a[0];
        else 
            rst[0] = b[0];
    
        for (i = 1; i <= rst[0]; i++)
        {
            rst[i] += flag;
            if (rst[i] < 0) 
            {
                flag = -1;
                rst[i] += 10;
            }
            else 
                flag = 0;
        }
        if (-1 == flag)
        {
            //此时,flag=-1表示a-b<0,故转换为求b-a。需要先将a,b翻转为原始数据
            rev(a);
            rev(b);
            sub(rst,b,a);
            //进行sub运算后,a,b,rst均为正常形式,需要将其翻转后,再添加负号。
            rev(rst);
            rev(a);
            rev(b);
    
            //在结果的最高位增加字符‘-’
            rst[0]++;
            rst[rst[0]] = 10;//如果某位为10,则输出时该位为“-”;
        }
        rev(rst);
        rev(a);
        rev(b);
    }
    
    int main()
    {
        int a[500], b[500], he[500], cha[500];
        printf("Input a:");
        read(a);
        printf("Input b:");
        read(b);
    
        add(he, a, b);
        sub(cha, a, b);
        print(he);
        print(cha);
        return 0;
    }
  • 相关阅读:
    自己用的,存储代码
    ASCII编码表
    全球最热门编程语言20种
    C++中二维数组new小结
    字符,字节和编码
    让工资涨的快的小技巧
    Ip Messenger
    xajax中文手册
    BitmapFile Formats(BMP文件的格式)
    python中返回字符串中指定字符的索引
  • 原文地址:https://www.cnblogs.com/Camilo/p/3831688.html
Copyright © 2011-2022 走看看