69,371
社区成员
发帖
与我相关
我的任务
分享
#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;
}
#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;
}
#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;
}
#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;
}