两个正整数相加的问题

djjlove_2008 2009-09-14 05:36:28
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
char *addBigInt(char *num1,char *num2)
{
int c = 0;
int i = strlen(num1) - 1;
int j = strlen(num2) - 1;
int maxLength = strlen(num1) >= strlen(num2) ?
(strlen(num1) + 1) : (strlen(num2) + 1);
char *rst = (char *)malloc(maxLength + 1);
int k;
if(rst == NULL)
{
printf("malloc error!\n");
exit(1);
}
rst[maxLength] = '\0';
k = strlen(rst) - 1;
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';
if(rst[0] != '0')
return rst;
else
return rst + 1;
}
int main()
{
char num1[] = "123456789323";
char num2[] = "45671254563123";
char *result = NULL;
result = addBigInt(num1,num2);
printf("%s + %s = %s\n",num1,num2,result);
system("pause");
return 0;
}
这道程序我明明看了很久,根本不存在逻辑上的错误,,两个正整数相加结果竟然不如人间哦,,,
程序功能倒是蛮简单的哦,,,就不加注释了咯,,,请原谅,,,
...全文
478 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
djjlove_2008 2009-09-22
  • 打赏
  • 举报
回复
呵呵,弄懂了,辛苦了各位大虾!!!
  • 打赏
  • 举报
回复
顶一个
djjlove_2008 2009-09-14
  • 打赏
  • 举报
回复
谢谢各位
niimp2 2009-09-14
  • 打赏
  • 举报
回复
1.初始化的问题
2.内存没有释放
Kusk 2009-09-14
  • 打赏
  • 举报
回复
_secend => _second

:)
aizibion 2009-09-14
  • 打赏
  • 举报
回复
自己封得一个其中得正整数加法

int CBigInt::pure_add(const char* _first,const char* _secend,std::string& _result)
{
if(_first == NULL || _secend == NULL)
{
return -1;
}

int flen = strlen(_first);
int slen = strlen(_secend);

int temp = 0;

int t_len = flen>slen ? flen : slen;
//动态分配存储结果数组,因为是加法,所以结果最大长度为最长操作数长度加1
//另加上一个结束符号位
char* t_result = new char[t_len+2];
if (t_result==NULL)
{
return -1;
}
memset(t_result,0,t_len+2);

flen--,slen--;
while (t_len >= 0)
{
if (flen<0)
{//如果其中以个操作数已经循环完,则结果仅加上另一个操作数
t_result[t_len] += _secend[slen]+48;
}
else if (slen<0)
{
t_result[t_len] += _first[flen]+48;
}
else
{
t_result[t_len] += _first[flen] + _secend[slen];
}

if (slen<0&&flen<0)
{
t_result[t_len] = 96;
}

//加上进位
t_result[t_len] += temp;
temp = 0;

if (t_result[t_len]>=106)
{//如果结果达到进位,置进位标志,并将结果复位
t_result[t_len] -= 10;
temp = 1;
}

//填写最终结果
t_result[t_len] -= 48;
t_len--,slen--,flen--;
}
char* p = t_result;
while (*p++=='0')
{
}
_result = --p;

delete []t_result;

return 0;
}
panyuxiao 2009-09-14
  • 打赏
  • 举报
回复
rst[maxLength] = '\0';
k = strlen(rst) - 1;
strlen(rst) 不使用于未初始化的字符串数组;
正解:
k = maxLength - 1;
w0911h 2009-09-14
  • 打赏
  • 举报
回复
rst[maxLength] = '\0';
k = strlen(rst) - 1;
rst可能提前遇到'\0'
Kusk 2009-09-14
  • 打赏
  • 举报
回复
rst未初始化时,不应使用strlen()于其上,因为中途任何一个字符都有可能为'\0':

k = strlen(rst) - 1;

=>

k = maxLength - 1;
hoomey 2009-09-14
  • 打赏
  • 举报
回复

//k = strlen(rst) - 1;//这里错了
替换成
k = maxLength - 1;
rst没有初始化
w0911h 2009-09-14
  • 打赏
  • 举报
回复
看错了,当我没说。。。。
[Quote=引用 1 楼 w0911h 的回复:]
没看完,好像下面的语句有问题,strlen(rst)应该就是maxLength+1,那么k就是maxLength
rst[maxLength] = '\0';
k = strlen(rst) - 1;

[/Quote]
w0911h 2009-09-14
  • 打赏
  • 举报
回复
没看完,好像下面的语句有问题,strlen(rst)应该就是maxLength+1,那么k就是maxLength
rst[maxLength] = '\0';
k = strlen(rst) - 1;

69,382

社区成员

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

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