c语言大整数乘法

Python015

c语言大整数乘法,第1张

#include<stdio.h>

#include<string.h>

void chengfa(char *a,char*b)

{

char c[10000]

int fuhao1,fuhao2

if(a[0] == '-' || a[0] == '+') {

if(a[0] == '-')

fuhao1 = -1

else fuhao1 = 1

strcpy(c,a+1)

strcpy(a,c)

}

if(b[0] == '-' || b[0] == '+') {

if(b[0] == '-')

fuhao2 = -1

else fuhao2 = 1

strcpy(c,b+1)

strcpy(b,c)

}

int i , j

for(i = 0i<10000i++){

c[i] = '0'

}

int lena = strlen(a)

int lenb = strlen(b)

for(i = lena-1i >=0i--){

int k = 0

for(j = lenb-1j >=0j--) {

char l = c[i+j+1]

c[i+j+1] = (c[i+j+1]-'0'+(b[j]-'0')*(a[i]-'0')+k)%10+'0'

k = (l-'0'+(b[j]-'0') * (a[i] -'0')+k)/10

}

if(k!= 0) c[i] += k

}

i = 0

j = 0

while(c[i] == '0') i++

while(i <= lena+lenb-1) {

a[j] = c[i]

j ++

i ++

}

a[j] = '\0'

if(a[0] == '\0') a[0] = '0',a[1] = '\0'

if(fuhao1*fuhao2 == -1 &&a[0] !='0') {

strcpy(c,a)

a[0] = '-'

a[1] = '\0'

strcat(a,c)

}

}

int main()

{

char a[10000],b[10000]

while(scanf("%s %s",a,b) == 2) {

chengfa(a,b)

printf("%s\n",a)

}

}

/*

//测试数据

3 4

12

1782362317836127863178 5

8911811589180639315890

2364782367834627864826 23478962483263478

55522636495472201715228381403526624828

*/

你的算法太难读了。估计效率也不怎么样。

晚上我直接给你贴一段以前我写的代码吧。

可惜了,我记错了,我的是大数阶乘的实现,和大数乘法略不同,仅供参考吧。

#include <iostream>

#include <time.h>

using namespace std

#define VAR 255000 //数组空间

void main()

{

printf(

"\n\n本程序可计算任意整数的阶乘,只要你的CPU和RAM足够强悍\n"

"\t如果想将中间计算过程输出到文本文件,可以按以下方法操作\n\n"

"\t在命令提示符下\n"

"\t-----本程序名 >>路径\\文本名.txt\n\n"

"\t-----y    回车\n\n"

"\t-----整数 回车\n\n"

"\t-----即可在文本中看到计算过程\n\n"

"\tCopyright H.M.Z 2005-11-16\n\n")

//-----------------------变量及初始化-------------------------

NEXT_COUNT:

unsigned long x[VAR+1]={0}, //存放运算结果

blk=1,mblk,

cx=0, //cx进位

n, //目的数

temp, //运算过程的临时变量

e //初始运算7的阶乘

x[VAR]=1 //6的阶乘为720

clock_t start=0,end=0,tmp

//unsigned long add=0,mul=0,div=0,yu=0,xia=0 //各种运算次数

printf("\n__________________________________\n")

printf("请输入要计算的n=")

scanf("%lu",&n)

start = clock()

printf("当前计算:")

//-----------------------运算核心-----------------------------

for(blk=1,e=1e<n+1e++){

printf("%6lu的阶乘\b\b\b\b\b\b",e)

for( mblk=1, cx=0 mblk<blk+2 ){

temp=x[VAR+1-mblk]

if(temp+cx==0){

mblk++

continue

} //如果当前块+前次进位=0本块跳过不计算

x[VAR+1-mblk]=( temp * e )% 1000000 +cx

cx=( temp * e )/ 1000000

mblk++

}

if(x[VAR-blk]>0)

blk++

}

//-----------------------输出最后结果-------------------------

printf("\n\n%d的阶乘>>\t",n)

printf("%lu",x[VAR+1-blk--])

for(blk>0blk--)

printf(",%06lu",x[VAR+1-blk])

end = clock()

tmp=end-start

cout<< "\n本次计算花费时间 "<<tmp/60000<<" 分 "

<<tmp/1000-tmp/60000<<" 秒 "

<<tmp%1000<<" 毫秒 "<<endl

printf("\n__________________________________\n")

//-----------------------继续计算-----------------------------

char cho

printf("\n继续计算吗?[Y/N]")

cin>>cho

if(cho=='y'||cho=='Y'){

goto NEXT_COUNT

}

}