一、特点:可随意分解超大数。
2.计算结果显示:(4位整数存储在数组的一个模块中)
三、C语言编程如下:
//分解超大数4(每个模块存储4位整数)
#include
#include
#include
#include
#define N 50 ///数组大小
main ()
{ 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外,单位数lbz;除数总位数lcz,单位数lcz
int jw,ss,l,g=0,jr=0; //进位jw,试商ss,积累单元数l,质量数g,进入指示jr
int lc1、lc1、lc2、b5、q,c3=2; //lb1=lb-1,lc1=lc-1,lc2=lcz*2-1,除数前5位B5及其平方根q,除数前三位C3(本行变量均为提高启动速度)
int z[50]={2,3,5,7,11,13,17,19,23,29,31,37,43,47,59,61,71,71,
73.79、83、89、97、101、103、109、1137、137、139、151、157、163、107、109、107、107、109、1137、137、137、137、139、157、157、157、167、167、137、137、137、137、137、137、137、137、137、137、137、137、137、13、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、137、157、157、157、157、157、157、157、167、167、167、167、167、167、167、167、167、167、167、167、167、167、167、167、167、167、167、167、167、107、107、107、107、107、107、107、107、107、107、1、1、17、1、107、107、107、107、107、107、107、107、1、1、107、1、1、1、107、1、1、107、107、107、107、107、107、107、107、1、107、107、107、1、1、1、1、1、1、1、107、1、1、107、107、107、107、107、1、1、107、107、1
173、179、181、191、197、199、211、2227、229}; //预付低于231的质量z(因231=3*7*11)
char bc[N]; //被除数串bc
//输入及转换:
printf(“请继续输入分解数:”);gets(bc);
float t0=clock(); ///计时开始
lbz=strlen(bc)-1; i=lb=lbz/4 1; //求被算术:总位数lbz,单位数lbz
for(x=lbz;x>=0;x–) //被算术字符串转换为整数
{ 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; 2倍lc2/除数位数
// A.未分解,继续分解:
if(lc2 { lbz=lb*4; lb1=lb-1; b5=b[lb]*10000 b[lb1];//a.被除数总位数lbz及其前5位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.被除数前五名算术根qq for(x=1;x<=lb;x ) {y[x]=b[x];} // c.开始做除法: for(i=lb;i>=lc;i–) { 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<=lc1;k ) { xj=c[k]*ss jw; if(xj<=9999)jw=0; else{jw=xj/10000;xj%=10000;} l=k i-lc; if(y[l] y[l]-=xj; } xj=c[lc]*ss jw; y[i]-=xj; } } while(y[lc]>=c[lc]) //d.确定是否已完成: { for(x=lc;x>=1;x–) { if(y[x]>c[x]) break; /1.余数大的再去减一次 if(y[x] } s[lc] ; //3.余数 >= 除数,再减一次 for(x=1;x<=lc1;x ) { if(y[x] y[x]-=c[x]; } y[lc]-=c[lc]; } tc: // e.判断余数是否为0: for(x=lc;x>=1;x–) { if(y[x]!=0) break;} if(x!=0) // 1.余数 != 0时,求新除数: { if(jr!=0) // 1) 除数超过预存质数组范围的,除数加2: { c[1] =2; g ; if(g#1!=0) // (1)绕过3、5、7、11倍率(因231=3*7*11): { while((g%3=0|c[1]5=0|g%7=0|==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<=lc;x ) { if(c[x]>=10000){c[x 1] ;c[x]-=10000;} } if(c[lc 1]>=1) lc ; lcz=lc*4; lc1=lc-1;//取除前三位数c33: 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时: else { printf(“*%d”,c[lc]); // 1)导出因素: for(x=lc1;x>=1;x–) printf(” d”,c[x]); for(x=lc;x<=lb1;x ) // 2)处理商进位: { if(s[x]>=10000) {s[x 1] ;s[x]-=10000;} } if(s[lb]==0) lb–; // 3)将商业变为被除数: for(x=lc;x<=lb;x ) {b[x-lc1]=s[x];} lb-=lc1; } } // B.分解后,导出最终因素: else { printf(“*%d”,b[lb]); // 导出首模块 for(x=lb1;x>=1;x–) printf(” d”,b[x]); //导出剩余单元(每4位为1模块,前面不到4位补0) break; } } printf(“n耗时%.6f秒”,(clock()-t0)/1000); ///导出运行时间 return 0; }