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;
    }

  • 相关阅读:
    【tyvj1864】[Poetize I]守卫者的挑战
    【tyvj1863】 [Poetize I]黑魔法师之门
    codevs2800送外卖(状压dp)
    noip2013day1t3货车运输(瓶颈路,树上倍增)
    noip2015day2t3运输计划(二分+树上前缀和)
    nginx.spec
    salt-syndic使用
    salt-call报错OSError: [Errno 13] Permission denied: '/root/.gvfs'
    SOCKET客户端编程
    nginx配置salt-api转发,iptables限制ip连接salt-api
  • 原文地址:https://www.cnblogs.com/muyiblog/p/6898188.html
Copyright © 2011-2022 走看看