关于设计任意两个长正整数(小于80位)的加法函数add()和乘法函数mult(),并求任意整数(≤58)的阶乘的问题
最近刚刚接触到这个,遇到了这个问题,其实本身算法个人觉得不难,但是因为要求的是用无符号整型或字符型数组存储任意长整数,超出了正常的存储范围,所以很困惑,希望各位能指点一下了,最好附上程序代码了。[注:使用C来写的,谢谢了]
程序代码:#include <stdio.h>
#include <string.h>
struct BigInt
{
char bit[500];//最大500位整数
int sign;//符号1位负数 0 位正数
int nbit;//大数位数
};
void InPut(BigInt *p)//整理
{
char *begin,*end;
begin = p->bit;
end = p->bit + strlen(p->bit)-1;
int i = strlen(p->bit)-1;
while(begin<=end)//将大数倒转并转为码存储
{
char temp = *begin - 48;
*begin = *end - 48;
*end = temp;
begin++;end--;
}
for(;i>=0;i--)//计算实际位数
if(p->bit[i])
break;
p->nbit = i+1;
}
void ForMat(BigInt *p)//整理大整数
{
for(int i = p->nbit-1;i>=0;i--)
if(p->bit[i])
break;
p->nbit = i+1;
}
void Multi(const BigInt *pa,const BigInt *pb,BigInt *pc)//乘法
{
int i,j,k;
if(pa->sign == pb->sign)//判断符号
pc->sign = 0;
else
pc->sign = 1;
for(i = 0;i<pb->nbit;i++)
{
int low = 0;//进位初始为0
for(j = 0;j<pa->nbit;j++)
{
int pos = i+j;//计算第i+j为的结果
int num = pb->bit[i]*pa->bit[j]+low;//临时结果加进位
pc->bit[pos] += num%10;//当前位临时结果 可能会大于10
low = num/10;//进位临时结果
low += pc->bit[pos]/10;//进位最终结果
pc->bit[pos] %= 10;//当前位最终结果
}
if(low)
pc->bit[i+j] += low;//如果进位不为0 还要继续进位
}
pc->nbit = i+j+1;//结果位数
ForMat(pc);
}
void OutPut(const BigInt *p)
{
int i,j,k;
if(p->nbit == 0)
{
printf("0\n");
return;
}
if(p->sign)//符号位1 是负数
printf("-");
for(i = p->nbit-1;i>=0;i--)
putchar(p->bit[i]+48);//把码转化成数
printf("\n");
}
int main()
{
char a[101] = {0};
char b[101] = {0};
BigInt zero = {0};
BigInt b1 = {0},b2 = {0},b3 = {0};
strcpy(b1.bit,"567456456");
strcpy(b2.bit,"12345");
InPut(&b1);
InPut(&b2);
Multi(&b1,&b2,&b3);
OutPut(&b3);
return 0;
}
/*
3453463453 res:119263751035385902
34534534
345345345345 res:18909991071872981900820
54756756756
5686574563456 res:32276182665043770698510336
5675856757856
567456456 res:7005249949320
12345
*/加法自己写吧 底下是测试数据
