一个hdoj大数相加问题

before_zero 2011-04-01 09:12:17
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1002

大数相加的问题

代码:

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

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

#define MAX_LEN 1000

typedef struct {
char number[MAX_LEN];
int length;
} BigNumber;

void initBigNumber(BigNumber*);
int asc2int(char);
char int2asc(int);
void inputBigBumber(BigNumber*, char[]);
BigNumber addBigBumber(BigNumber, BigNumber);
char* strBigBumber(BigNumber);

int main(void) {

BigNumber a, b, result;
int T, ids = 1;

initBigNumber(&a);
initBigNumber(&b);
initBigNumber(&result);

scanf("%d", &T);
//getchar();
if (T >= 1 && T <= 20) {
while (ids <= T) {

char stra[MAX_LEN], strb[MAX_LEN];
scanf("%s%s", stra, strb);
inputBigBumber(&a, stra);
inputBigBumber(&b, strb);
result = addBigBumber(a, b);

printf("Case %d:\n%s + %s = %s\n", ids, strBigBumber(a),
strBigBumber(b), strBigBumber(result));
if(ids < T)
printf("\n");

ids++;
}

}


return EXIT_SUCCESS;
}

char* strBigBumber(BigNumber result) {
int i = 0;
int ids = 0;
char *s = (char*) malloc((result.length + 1) * sizeof(char));
for (i = result.length - 1; i >= 0; i--) {
s[ids++] = result.number[i];
}
s[result.length] = '\0';
return s;
}

BigNumber addBigBumber(BigNumber a, BigNumber b) {
int slop = 0, i;
int len = (a.length > b.length) ? a.length : b.length;
int zero = 0;
BigNumber result;
initBigNumber(&result);
result.length = len;

for (i = 0; i < len; i++) {
int t = asc2int(a.number[i]) + asc2int(b.number[i]) + slop;
if (t >= 10) {
t = t - 10;
slop = 1;
} else {
slop = 0;
}

result.number[i] = int2asc(t);
}
if (slop == 1) {
result.number[result.length] = int2asc(slop);
result.length = result.length + 1;
}


for(i = result.length - 1; i >= 0 && !zero; i--){
if(result.number[i] == '0'){
result.length = result.length - 1;
}else{
zero = 1;
}
}

return result;
}

void initBigNumber(BigNumber *big) {
int i = 0;
while (i < MAX_LEN) {
big->number[i] = '0';
i++;
}
big->length = 0;
}

int asc2int(char ch) {
return (int) (ch - 48);
}

char int2asc(int a) {
return (char) (a + 48);
}

void inputBigBumber(BigNumber *big, char s[]) {
int len = strlen(s);
int i,ids = 0;
for(i = len - 1; i >= 0; i--){
big->number[ids++] = s[i];
}
big->length = ids;
}


我准备了测试数据,用网上AC的代码跟自己代码比较结果还有格式都完全一样,不知道为什么一直Wrong Answer??
...全文
99 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ulfsaar 2011-04-02
  • 打赏
  • 举报
回复
MAX_LEN 1000
这个有问题,题目说的输入的数不会超过1000位,考虑到进位以及'\0'等,应该再加长一点
before_zero 2011-04-02
  • 打赏
  • 举报
回复
谢谢!终于AC,貌似不去前面的0也可以AC。

[Quote=引用 5 楼 ulfsaar 的回复:]

initBigNumber(&a);
initBigNumber(&b);
initBigNumber(&result);
初始化要搬到While循环里面去,scanf之前先初始化,防止上次的结果下次造成影响,你的程序就是因为这个才WA的
修改后AC了的Code:
C/C++ code

#include <stdio.h>
#incl……
[/Quote]
Ulfsaar 2011-04-02
  • 打赏
  • 举报
回复
initBigNumber(&a);
initBigNumber(&b);
initBigNumber(&result);
初始化要搬到While循环里面去,scanf之前先初始化,防止上次的结果下次造成影响,你的程序就是因为这个才WA的
修改后AC了的Code:

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

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

#define MAX_LEN 1000

typedef struct
{
char number[MAX_LEN];
int length;
} BigNumber;

void initBigNumber(BigNumber*);
int asc2int(char);
char int2asc(int);
void inputBigBumber(BigNumber*, char[]);
BigNumber addBigBumber(BigNumber, BigNumber);
char* strBigBumber(BigNumber);

int main(void) {

BigNumber a, b, result;
int T, ids = 1;

scanf("%d", &T);
//getchar();
if (T >= 1 && T <= 20) {
while (ids <= T) {

char stra[MAX_LEN], strb[MAX_LEN];
initBigNumber(&a);
initBigNumber(&b);
scanf("%s%s", stra, strb);
inputBigBumber(&a, stra);
inputBigBumber(&b, strb);
initBigNumber(&result);
result = addBigBumber(a, b);

printf("Case %d:\n%s + %s = %s\n", ids, strBigBumber(a),
strBigBumber(b), strBigBumber(result));
if(ids < T)
printf("\n");

ids++;
}

}


return EXIT_SUCCESS;
}

char* strBigBumber(BigNumber result) {
int i = 0;
int ids = 0;
char *s = (char*) malloc((result.length + 1) * sizeof(char));
for (i = result.length - 1; i >= 0; i--) {
s[ids++] = result.number[i];
}
s[result.length] = '\0';
return s;
}

BigNumber addBigBumber(BigNumber a, BigNumber b) {
int slop = 0, i;
int len = (a.length > b.length) ? a.length : b.length;
int zero = 0;
BigNumber result;
initBigNumber(&result);
result.length = len;

for (i = 0; i < len; i++) {
int t = asc2int(a.number[i]) + asc2int(b.number[i]) + slop;
if (t >= 10) {
t = t - 10;
slop = 1;
} else {
slop = 0;
}

result.number[i] = int2asc(t);
}
if (slop == 1) {
result.number[result.length] = int2asc(slop);
result.length = result.length + 1;
}


for(i = result.length - 1; i >= 0 && !zero; i--){
if(result.number[i] == '0'){
result.length = result.length - 1;
}else{
zero = 1;
}
}

return result;
}

void initBigNumber(BigNumber *big) {
int i = 0;
while (i < MAX_LEN) {
big->number[i] = '0';
i++;
}
big->length = 0;
}

int asc2int(char ch) {
return (int) (ch - 48);
}

char int2asc(int a) {
return (char) (a + 48);
}

void inputBigBumber(BigNumber *big, char s[]) {
int len = strlen(s);
int i,ids = 0;
for(i = len - 1; i >= 0; i--){
big->number[ids++] = s[i];
}
big->length = ids;
}


Ulfsaar 2011-04-02
  • 打赏
  • 举报
回复
应该是你相加的程序写的有问题
找到了一组错误的数据:
111111 9
你输出地结果是5211120
before_zero 2011-04-01
  • 打赏
  • 举报
回复
你说的是 0011 + 99 = 110,这个处理了

[Quote=引用 1 楼 ulfsaar 的回复:]

引用楼主 before_zero 的回复:
...
我准备了测试数据,用网上AC的代码跟自己代码比较结果还有格式都完全一样,不知道为什么一直Wrong Answer??
...

这说明你的测试数据不够强力
你有处理前导零么?
[/Quote]
Ulfsaar 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 before_zero 的回复:]
...
我准备了测试数据,用网上AC的代码跟自己代码比较结果还有格式都完全一样,不知道为什么一直Wrong Answer??
...
[/Quote]
这说明你的测试数据不够强力
你有处理前导零么?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧