回复 10楼 二0一一628
我明白了是因为最后的for循环中
for(j=999;....) 这里写成 j=99了
所以只打出了前99个
你改改,程序是对的
#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 */3楼的写的这么复杂啊 大数乘法就可以吧 不过我的写的也有点复杂