这个问题的关键之处就是大整数的乘法问题了,给你一个大整数乘法的C程序,你可以在此基础上自己添加一个累加函数以达到你的目的:
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void prt(const int *a,int size)
{
int i;
for (i = 0; i<size; i++) {
printf("%u",a[i]);
}
putchar('\n');
}
void mst(int *rt,int len,const int *a,int lena,const int b,const int index)
/*计算保存在数组中的整数a与一个小于10的自然数b的乘积,结果保存到rt数组中,index表示b是整个乘法中乘数的第几位*/
{
int i;
int j;
for (i=len-index-1,j=lena-1; j>=0; --j,--i) {
rt[i]+=a[j]*b;
rt[i-1]+=rt[i]/10;
rt[i]%=10;
}
}
int *tran(const char *a)
{
int i,*rt,lena=strlen(a);
rt=malloc(sizeof(int)*lena);
for (i = 0; i<lena; i++) {
rt[i]=a[i]-48;
}
return rt;
}
int *mt(const char *a,const char *b,int *len)
/*返回两个大整数的积,两个大整数以字符串的型式保存在a和b数组中,返回保存相乘结果的整型数组地址,结果的长度由指针len带回*/
{
int i,j,lena=strlen(a),lenb=strlen(b),lenm;
int *ta,*tb,*tc,*mu;
lenm=lena<lenb?lena:lenb;
mu=malloc((lena+lenb)*sizeof(int));
if (lena>=lenb) {
ta=tran(a);
tb=tran(b);
}
else{
i=lena;
lena=lenb;
lenb=i;
ta=tran(b);
tb=tran(a);
}
tc=calloc(lena+lenb,sizeof(int)); /*tc数组保存最终的计算结果*/
for (i = 0; i<lenm; i++) { /*模拟笔算过程,保存每一位的乘积*/
memset(mu,0,(lena+lenb)*sizeof(int));
mst(mu,lena+lenb,ta,lena,tb[lenb-1-i],i);
for (j = lena+lenb-1; j>=0; j--) {/*将每一位的乘积相加,得到最终的结果*/
tc[j]+=mu[j];
if (j>0) tc[j-1]+=tc[j]/10;
tc[j]%=10;
}
}
free(ta);
free(tb);
free(mu);
*len=lena+lenb;
return tc;
}
int main(void)/*调用示例*/
{
char numa[]="123456789123456789",numb[]="9876543219876543210";
int len,*a;
a=mt(numa,numb,&len);/*计算numa和numb和乘积*/
prt(a,len);/*输出计算结果*/
free(a);
return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
温馨提示:答案为网友推荐,仅供参考