您的位置:首页 > 其它

大数相加, 大数相乘

2011-01-04 18:36 411 查看
没怎么测试, 有BUG请提出, 注意加法时参数1要大于等于参数2, 乘法无限制

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

//len1 >= len2
char *Add(const char *param1, const char *param2, int len1, int len2)
{
int i = 0;
int j = 0;

char *res = (char*)malloc((len1+2)*sizeof(char));
memset(res, 0, len1+2);

for (i=len1-1; i>=0; --i)
res[i+1] += param1[i] - 0x30;

for (i=len1, j=len2-1; j>=0; --j, --i)
{
res[i] += param2[j] - 0x30;
if (res[i] > 9)
{
res[i-1] += 1;
res[i] -= 10;
}
}

if (res[1] > 9)
{
res[0] += 1;
res[1] -= 10;
}

for (i=0; i<=len1; ++i)
res[i] += 0x30;

if (res[0] == 0x30)
for (i=0; res[i]!='/0'; ++i)
res[i] = res[i+1];

return res;
}

//no limit while len1>len2 or len1<len2
char *Multi(char *param1, char *param2, int len1, int len2)
{
char *res = (char*)malloc((len1+len2+1)*sizeof(char));
memset(res, 0, (len1+len2+1)*sizeof(char));

int i = 0;
int j = 0;
int k = 0;
int m = 0;
int n = 0;

for (i=len1-1, k=len1+len2-1; i>=0; --i, --k)
{
m = k;
for (j=len2-1; j>=0; --j)
{
res[m] += (param1[i] - 0x30) * (param2[j] - 0x30);
n = res[m]/10;
if (n > 0)
{
res[m-1] += n;
res[m] -=10*n;
}
--m;
}
}

for (i=0; i<=len1+len2-1; ++i)
res[i] += 0x30;

if (res[0] == 0x30)
for (i=0; res[i]!='/0'; ++i)
res[i] = res[i+1];

return res;
}

int main()
{
char ch1 = '4';
char ch2 = '7';
char ch3 = ch1 - 0x30 + ch2 - 0x30;
printf("%c, %c, %d,/n", ch1, ch2, ch3);//打出a对应的ascii码
printf("----------/n");

char param1[100] = "9999";
char param2[100] = "999";
int len1 = strlen(param1);
int len2 = strlen(param2);

printf("%s, %s/n", Add(param1, param2, len1, len2), Multi(param1, param2, len1, len2));

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: