zoukankan      html  css  js  c++  java
  • 任意长整数求和

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #ifdef DEBUG
    #define debug(fmt, args...) printf(fmt, ##args)
    #else
    #define debug(fmt, args...)
    #endif

    char *big_add(char *num1, char *num2)
    {
    int c = 0; /* 开始最低进位为0 */
    int i = strlen(num1) - 1; /* 指向第一个加数的最低位 */
    int j = strlen(num2) - 1; /* 指向第二个加数的最低位 */
    int k;/* 指向结果的最低位 */

    debug("i = %d, j = %d ", i, j);
    debug("num1 = %s, num2 = %s ", num1, num2);

    /* 得到两个数中较大数的位数,并加1位作为预留进位空间 */
    int maxLength = strlen(num1) >= strlen(num2) ? strlen(num1) + 1 : strlen(num2) + 1;
    debug("maxLength = %d ", maxLength);

    char *rst = (char *)malloc(sizeof(char) * (maxLength + 1));
    if (rst == NULL)
    {
    printf("malloc error ");
    exit(1);
    }

    rst[maxLength] = '';
    k = maxLength - 1; /* 指向结果的最低位 */
    debug("k = %d ", k);

    while ((i >= 0) && (j >= 0))
    {
    /* 进算本位的值 */
    rst[k] = ((num1[i] - '0') + (num2[j] - '0') + c)%10 + '0';
    /* 向高位进位的值 */
    c = ((num1[i] - '0') + (num2[j] - '0') + c) / 10;
    --i;
    --j;
    --k;
    }
    while (i >= 0)
    {
    rst[k] = ((num1[i] - '0') + c)%10 + '0';
    c = ((num1[i] - '0') + c) / 10;
    --i;
    --k;
    }
    while (j >= 0)
    {
    rst[k] = ((num2[j] - '0') + c)%10 + '0';
    c = ((num2[j] - '0') + c) / 10;
    --j;
    --k;
    }

    rst[0] = c + '0';

    /* 之所以返回首地址而不在该函数去判断是否有进最高位是因为要释放内存
    * 否则在没有进位的情况下内存释放会有问题
    */
    return rst;
    /*
    if (rst[0] != '0')
    {
    debug("in if ");
    return rst;
    }
    else
    {
    debug("in else if ");
    return (rst + 1);
    }
    */
    }

    int main(int argc, char **argv)
    {
    char *res = NULL;

    if (argc != 3)
    {
    printf("Usage: ");
    printf("%s num1 num2 ", argv[0]);
    return -1;
    }

    res = big_add(argv[1], argv[2]);
    if (res[0] != '0')
    printf("%s + %s = %s ", argv[1], argv[2], res);
    else
    printf("%s + %s = %s ", argv[1], argv[2], res + 1);


    free(res);
    return 0;
    }

  • 相关阅读:
    centos服务器上线第二个django项目方法。
    centos7服务器部署django项目。
    C# 修饰符
    PLSQL 12 安装、连接Oracle
    GAC 解释&路径
    WebService 创建、发布、调用
    区域性名称和标识符
    关键字
    运算符 &(与运算)、|(或运算)、^(异或运算)
    ASCII,Unicode,UTF-8,GBK 区别
  • 原文地址:https://www.cnblogs.com/muyiblog/p/6898188.html
Copyright © 2011-2022 走看看