1.特点:可以分解任意超级大数。
2.运算结果显示:(用数组的一个单元存储4位整数)
三。用C语言编程如下:
//超大号4的分解(每个单元格存储4位整数)
# include & ltstdio.h & gt//I/O头函数
# include & ltstring.h & gt//字符串头函数
# include & lt***th.h & gt//数学头函数
# include & lttime.h & gt//日期时间头函数
#定义N ^ 50//数组大小
主()
{ unsigned bz[N*4]={},b[N]={},c[N]={0,2},s[N]={},y[N*2]={},XJ;//被除数B,除数C,商S,余数Y,新产品xj
int i,k,x,lbz,lb,lcz=1,LC = 1;//循环变量I,k,x;股息总位数lbz,单位数lb;除数lcz的总位数,单元数lc
int jw,ss,l,g=0,Jr = 0;//进位jw,试商ss,乘积的单位数l,质数g,输入指令Jr。
int lb1,lc1,lc2,b5,q,C3 = 2;//LB1 = LB-1,LC1 = LC-1,LC2 = LCZ * 2-1,被除数的前五位b5及其平方根Q,除数的前三位c3(这行所有变量都是为了提高运行速度)
int zl = k+I-LC;={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,
73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,
173,179,181,191,193,197,199,211,223,227,229};//预存小于231的质数Z(因为231=3*7*11)
char BC[N];//红利字符串bc
//输入和转换:
printf(“请连续输入分解后的数字:”);gets(BC);
浮点t0 = clock();//计时开始
lbz = strlen(BC)-1;I = lb = lbz/4+1;//找到要计数的数字:总位数lbz,单位数lb
for(x = lbz;x & gt=0;x & # 8211)//通过算术字符串转换为整数
{ b[I]= b[I]* 10+BC[lbz-x]-48;
if(x % 4 = = 0){ I –;}//每单元存储4位整数
}
//开始分解:
lbz++;printf(”= 1″);
while(lcz <=lbz)
{ lc2 = lcz * 2-1;//除数位数lc2的两倍
//a .如果没有完全分解,继续分解:
if(lc2 <lbz | |(lc2 = = lbz && ampc3 & lt=q))
{ lbz = lb * 4;lb1 = l B- 1;b5 = b[lb]* 10000+b[lb1];//a .求被除数的总位数lbz及其前五位b5:
if(b[lb]>= 1000){ b5 = b[lb]* 10+b[lb1]/1000;}
else if(b[lb]>= 100){ lbz –;b5 = b[lb]* 100+b[lb1]/100;}
else if(b[lb]>= 10){ lbz-= 2;b5 = b[lb]* 1000+b[lb1]/10;}
else { lbz-= 3;b5 = b[lb]* 10000+b[lb1];}
q = sqrt(b5+1);lc1 = LC-1;//b .求被除数前5位的算术根Q
for(x = 1;x & lt= lbx++){ y[x]= b[x];}//c .开始做除法:
for(I = lb;我& gt= lc我–)
{ y[I]+= y[I+1]* 10000;y[I+1]= 0;s[I]= 0;
while(y[I]>c[lc]
{ if(y[I]>= 214748)ss = y[I]/(c[LC]+1);
else ss =(y[I]* 10000+y[I-1]/(c[LC]* 10000+c[lc1]+1);
if(ss = = 0)ss = 1;
jw = 0;s[I]+= ss;
for(k = 1;k & lt= lc1k++)
{ XJ = c[k]* ss+jw;
if(XJ <= 9999)jw = 0;else { jw = XJ/10000;xj % = 10000}
[50]
if(y[l]<XJ){ y[l]+= 10000;y[l+1]–;}
y[l]-= XJ;
}
XJ = c[LC]* ss+jw;
y[I]-= XJ;
}
}
while(y[LC]>= C [LC])//d .判断除法是否完成:
{ for(x = LC;x & gt=1;x & # 8211)
{ if(y[x]>c[x])break;//1.再次减去余数。
if(y[x]<c[x])goto TC;//2.以小余数退出除法
}
s[LC]++;//3.余数>:=除数,再减去它
for(x = 1;x & lt= lc1x++)
{ if(y[x]<c[x]){ y[x]+= 10000;y[x+1]–;}
y[x]-= c[x];
}
y[LC]-= c[LC];
}
tc:
//e .判断余数是否为0:
for(x = LC;x & gt=1;x & # 8211)
{ if(y[x]!=0)断开;}
如果(x!=0) // 1.余数!= 0,求新除数:
{ if(jr!=0) // 1)如果除数超过预存质数数组的范围,则除数加2:
{ c[1]+= 2;g++;
if(g%231!=0) // (1)跳过3,5,7,11的倍数(因为231=3*7*11):
{ while((g % 3 = = 0 | | c[1]% 5 = = 0 | | g % 7 = = 0 | | g % 11 = = 0)= = 1)
{ g++;c[1]+= 2;}
}
else { g = 1;c[1]+= 2;} // (2)直接加2
if(c[1]>=10000) //(3)每个单位求除数:
{ c[2]++;c[1]-= 10000;
for(x = 2;x & lt= lcx++){ if(c[x]>= 10000){ c[x+1]++;c[x]-= 10000;} }
if(c[lc+1]>= 1)lc++;
lcz = LC * 4;lc1 = LC-1;//取除数c3的前3位:
if(c[lc]>= 1000){ C3 = c[LC]/10;}
else if(c[lc]>= 100){ lcz –;C3 = c[LC];}
else if(c[lc]>= 10){ lcz-= 2;C3 = c[LC]* 10+c[lc1]/1000;}
else { lcz-= 3;C3 = c[LC]* 100+c[lc1]/100;}
}
}
Else // 2)如果除数在预存素数的范围内,则直接读取:
{ c[1]= z[g];g++;
if(g = = 50){ Jr = 1;g = 1;c[1]= 233;}
lcz = log10(c[1])+1;//求除数位数lc,四舍五入。
}
}
// 2.当余数=0时:
其他
{ printf(“* % d & # 8221,c[LC]);// 1)输出因子:
for(x = lc1;x & gt=1;x & # 8211)printf(”% 04d & # 8221,c[x]);
for(x = LC;x & lt= lb1+x++) // 2)处理商进位:
{ if(s[x]>= 10000){ s[x+1]++;s[x]-= 10000;}
}
if(s[lb]= = 0)lb –;// 3)将商转化为被除数:
for(x = LC;x & lt= lbx++){ b[x-lc1]= s[x];}
lb-= lc1;
}
}
//b .分解后输出最终因子:
其他
{ printf(“* % d & # 8221,b[lb]);//输出头单元
for(x = lb1;x & gt=1;x & # 8211)printf(”% 04d & # 8221,b[x]);//输出剩余单位(每4位为1个单位,不足4位前加0)
打破;
}
}
printf(“n用了%.6f秒”,(clock()-t0)/1000);//输出运行时间
返回0;
}
本文来自一九九几的她投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/598176.html