【擂台】大数运算加减乘除运算

莫_问 2008-11-12 10:30:59


无聊发个擂台玩玩!!大数运算 算法速度最快赠送400分 (开新贴赠分)

要求如下:
所有的运算数保存在字符数组中,运算数的位数不限制,
为加减乘除, 编写四个函数,例如:
char * add(char *a,char *b)
{

}

指针a,b是运算数的首地址,返回运算结果的字符串首地址。
...全文
491 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
pkriwork 2011-04-10
  • 打赏
  • 举报
回复
谢谢chiyer的代码,学习了。
netsandy 2010-03-03
  • 打赏
  • 举报
回复
netsandy,http://download.csdn.net/source/624366,要写下地址哟。
borefo 2009-11-25
  • 打赏
  • 举报
回复
mark
piaomiaoju 2008-11-13
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <malloc.h>
#include<string.h>
#include<stdio.h>
char* mul(const char* a,const char* b)
{
int len_a = (int)strlen(a);
int len_b = (int)strlen(b);

const char* pa = 0;
const char* pb = 0;
char* pr = 0;

char* res = 0;
int ex = 0;
int t = 0;
int i = 0;

if (!a || !b)
return 0;

if (len_a > len_b)//实际上len_a+len_b+1 就可以,最后1保留给'0';
{
res = (char*)malloc(sizeof(char) * (len_a * 2 + 2));
memset(res, '0', sizeof(char) * (len_a * 2 + 2));
}
else
{
res = (char*)malloc(sizeof(char) * (len_b * 2+ 2));
memset(res, '0', sizeof(char) * (len_b * 2 + 2));
}

pb = b + len_b;

while (--pb >= b)
{
pa = a + len_a;
pr = res + (i++);//pb 已经移位,所有的值乘10,即指针移一位。

while (--pa >= a || ex)//固定pb元素,累计一行值,存入pr
{
if (pa >= a)
ex = ex + (*pa - '0') * (*pb - '0') + (*pr - '0');
else
ex = ex + (*pr - '0');
t = ex % 10; //当前余数
ex = ex / 10; //保留进位信息 作为下一步累加值

*pr++ = t + '0';
}
}

*pr = 0;
strrev(res);//因为pr是从左边开始的,但实际要从右边开始,所以反转

return res;
}

int main()
{
char* r = mul("99999912345999999123459999991234599999912345", "12345678999999991234599999912345");
printf("%s\n", r);
free(r);

return 0;
}

========================
自己看完楼上的代码,加点注释,方便后来人
星羽 2008-11-13
  • 打赏
  • 举报
回复
乘的,加上各对乘0的判断吧 - -

#include "stdlib.h"
#include "malloc.h"

char* mul(const char* a, const char* b)
{
int len_a = (int)strlen(a);
int len_b = (int)strlen(b);

char* pa = 0;
char* pb = 0;
char* pr = 0;

char* res = 0;
int ex = 0;
int t = 0;
int i = 0;

if (!a || !b)
return 0;

if ((len_a == 1 && (*a) == '0') || (len_b == 1 && (*b) == '0'))
{
res = (char*)malloc(sizeof(char) * 2);
strcpy(res, "0");
return res;
}

if (len_a > len_b)
{
res = (char*)malloc(sizeof(char) * (len_a * 2 + 2));
memset(res, '0', sizeof(char) * (len_a * 2 + 2));
}
else
{
res = (char*)malloc(sizeof(char) * (len_b * 2+ 2));
memset(res, '0', sizeof(char) * (len_b * 2 + 2));
}

pb = b + len_b;

while (--pb >= b)
{
pa = a + len_a;
pr = res + (i++);

while (--pa >= a || ex)
{
if (pa >= a)
ex = ex + (*pa - '0') * (*pb - '0') + (*pr - '0');
else
ex = ex + (*pr - '0');
t = ex % 10;
ex = ex / 10;

*pr++ = t + '0';
}
}

*pr = 0;
strrev(res);

return res;
}

星羽 2008-11-13
  • 打赏
  • 举报
回复



#include "stdlib.h"
#include "malloc.h"

char* mul(const char* a, const char* b)
{
int len_a = (int)strlen(a);
int len_b = (int)strlen(b);

char* pa = 0;
char* pb = 0;
char* pr = 0;

char* res = 0;
int ex = 0;
int t = 0;
int i = 0;

if (!a || !b)
return 0;

if (len_a > len_b)
{
res = (char*)malloc(sizeof(char) * (len_a * 2 + 2));
memset(res, '0', sizeof(char) * (len_a * 2 + 2));
}
else
{
res = (char*)malloc(sizeof(char) * (len_b * 2+ 2));
memset(res, '0', sizeof(char) * (len_b * 2 + 2));
}

pb = b + len_b;

while (--pb >= b)
{
pa = a + len_a;
pr = res + (i++);

while (--pa >= a || ex)
{
if (pa >= a)
ex = ex + (*pa - '0') * (*pb - '0') + (*pr - '0');
else
ex = ex + (*pr - '0');
t = ex % 10;
ex = ex / 10;

*pr++ = t + '0';
}
}

*pr = 0;
strrev(res);

return res;
}

int main()
{
char* r = mul("99999912345999999123459999991234599999912345", "12345678999999991234599999912345");
printf("%s\n", r);
free(r);

return 0;
}
太乙 2008-11-13
  • 打赏
  • 举报
回复
我以前写的那个,就不拿出来丢人现眼了~~~~~
星羽 2008-11-13
  • 打赏
  • 举报
回复

#include "stdlib.h"
#include "malloc.h"

char* add(const char* a, const char* b)
{
int len_a = (int)strlen(a);
int len_b = (int)strlen(b);

char* pa = 0;
char* pb = 0;
char* pr = 0;

char* res = 0;
int ex = 0;
int t = 0;

if (!a || !b)
return 0;

if (len_a > len_b)
res = (char*)malloc(sizeof(char) * (len_a + 2));
else
res = (char*)malloc(sizeof(char) * (len_b + 2));

pa = a + len_a - 1;
pb = b + len_b - 1;
pr = res;

while (pa >= a || pb >= b || ex)
{
if (pa >= a)
ex += (*pa) - '0';

if (pb >= b)
ex += (*pb) - '0';

t = ex % 10;
ex = ex / 10;

*pr++ = t + '0';
--pa;
--pb;
}

*pr = 0;
strrev(res);

return res;
}

int main()
{
char* r = add("123456789123456789123456789123456789123456789", "99876500009987650000");
printf("%s\n", r);
free(r);

return 0;
}


nk_ysg 2008-11-13
  • 打赏
  • 举报
回复
up Chiyer 代码拷下来好好学习
jolly_ye 2008-11-13
  • 打赏
  • 举报
回复
学习中……
backway 2008-11-13
  • 打赏
  • 举报
回复
自叹不如~
xianyuxiaoqiang 2008-11-13
  • 打赏
  • 举报
回复
偶用汇编做过一个大数加法,就不拿来丢人现眼了- -!
Longinc 2008-11-13
  • 打赏
  • 举报
回复
学习
cyj626 2008-11-13
  • 打赏
  • 举报
回复
-_-!

具体什么思想啊?
解释下。
  • 打赏
  • 举报
回复
.......
我的blog上面有一篇是讲这个的,有代码, +-*/ %都实现了

69,371

社区成员

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

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