大侠帮我看一下代码
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]]
----------------解决方案--------------------------------------------------------
最好加些注释
----------------解决方案--------------------------------------------------------
英文注释..汉..
----------------解决方案--------------------------------------------------------