当前位置: 代码迷 >> C语言 >> 大侠帮我看一下代码
  详细解决方案

大侠帮我看一下代码

热度:143   发布时间:2008-04-05 14:19:23.0
大侠帮我看一下代码
c语言大数加法问题

老板要求你和 Tom 一起编写一个可以进行大数(不超过500位数字)四则运算的计算器。很显然,这样的大数已经无法用 C 语言中的常规变量直接表示,而你们必须要实现高精度计算的算法。

考虑到加法是各种运算的基础,你们决定从加法开始写起。你和 Tom 进行了分工,他负责编写程序的主函数,而你要编写 add 和 revnum 两个子函数。你们约定了函数的接口如下:

void add(char a[], char b[], char r[]);其中,a 表示被加数、b 表示 加数,而 r 中应当存放 a 和 b 两个函数的和。这三个数字都是使用字符数组来表示的,该大数的各位数字的字符由低至高存储在数组中。譬如被加数 a 为 6894 时,
a[0] = '4', a[1] = '9', a[2] = '8', a[3] = '6', a[4...500] = '\0'为了将数字由高位在前的存储方式转变为低位在前的存储方式,方便模拟加法的计算,Tom 请你再编写一个 revnum 函数,该函数的接口如下:

void revnum(char *num);这个函数应当可以把字符数组 num 中存储的字符颠倒,即把 "1234" 转换成 "4321",参数 num 是一个以 '\0' 结尾的字符串。

输入
该程序的输入包括 n (n >= 0) 对大数,每对大数一行,两个大数之间以空白符分割。

输出
针对每一对大数,输出运算结果。

注意
程序的主函数Tom已经编写好,你只需提交编写好的两个子函数即可。
问题补充:预设代码如下

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

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

void revnum(char *num);
void add(char a[], char b[], char c[]);

int main()
{
char a[501], b[501], r[501];
int n;

for(;;) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(r, 0, sizeof(r));

n = scanf("%s %s\n", a, b);
if (n != 2) break;

revnum(a);
revnum(b);
add(a, b, r);
revnum(r);

printf("%s\n", r);
}

return 0;
}

/* PRESET CODE END - NEVER TOUCH CODE ABOVE*/
搜索更多相关的解决方案: 代码  

----------------解决方案--------------------------------------------------------
下面是我的代码,我试了一下,功能正确。帮忙评价一下,看看有哪些可以改动的地方:
(修订版0.2:加入简短注释。)

/*reverse the string num.*/
void revnum(char *num)
{
    char *front, *rear;
    char temp;

    front=num;
    rear=front;
    
    while('\0'!=*rear)
        rear++;
    rear--;
    
    while(front<rear){
        temp=*front;
        *(front++)=*rear;
        *(rear--)=temp;
    }
}


/*Add b to a, and store the result in r.*/
/*All the char arrays a,b,c represent big numbers, with each*/
/*char element represent a digit.*/
void add(char a[], char b[], char r[])
{
    int i=0,j,cflag=0;    //cflag is the carry flag.

    while((0!=a[i])&&(0!=b[i])){        //add b[] to a[] and store the result to r[] digit by digit
        r[i]=a[i]+b[i]-'0';        //until there is no digit in a or b.
        if(cflag)
            r[i]++;

        cflag=(r[i]-'0')/10;
        r[i]=(r[i]-'0')%10+'0';
        i++;
    }
    
    j=i-1;                        //place the rest to r[]
    while(0!=a[++j])
        r[j]=a[j];
    while(0!=b[++j])
        r[j]=b[j];

    while(cflag){                    //take  the last flag into acount.
        r[i]=(r[i]+cflag-'0')%10+'0';
        cflag=(r[i]+cflag-'0')/10;
        i++;
    }


}

[[it] 本帖最后由 jamesbind 于 2008-4-5 17:27 编辑 [/it]]
----------------解决方案--------------------------------------------------------
最好加些注释
----------------解决方案--------------------------------------------------------
英文注释..汉..
----------------解决方案--------------------------------------------------------
  相关解决方案