| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 581 人关注过本帖
标题:大侠帮我看一下代码
只看楼主 加入收藏
jamesbind
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2008-3-21
收藏
 问题点数:0 回复次数:3 
大侠帮我看一下代码
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*/
搜索更多相关主题的帖子: 代码 
2008-04-05 14:19
jamesbind
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2008-3-21
收藏
得分:0 
下面是我的代码,我试了一下,功能正确。帮忙评价一下,看看有哪些可以改动的地方:
(修订版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]]
2008-04-05 14:20
now
Rank: 1
来 自:广州
等 级:新手上路
帖 子:544
专家分:0
注 册:2007-11-9
收藏
得分:0 
最好加些注释

GIS
Geographic Information System
你在哪里?——》你的坐标?
2008-04-05 14:49
bianfeng
Rank: 1
等 级:新手上路
帖 子:199
专家分:0
注 册:2007-11-28
收藏
得分:0 
英文注释..汉..
2008-04-05 18:25
快速回复:大侠帮我看一下代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013339 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved