一、特点:可以分解任意超大数。
二、运算结果显示:(数组的一个单元用于存储4位整数)。
第三,用C语言编程如下:
//分解超大数4(每个单元存储4位整数)。
# include estio . h//I/O头函数。
#include string.h //字符串头函数。
#include math.h //math header函数。
#include time.h //datetime标头函数。
#定义N 50 //阵列大小。
main()
{无符号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 z[50]={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};//预存质数z小于231(因为231=3*7*11)。
char BC[N];//股息字符串bc
//输入和转换:
Printf("请连续输入分解数:");get(BC);
float t0=clock();//计时开始。
lbz=strlen(BC)-1;I=lb=lbz/4 1;//求计数数:总位数lbz,单位数lb。
for(x=lbz;x=0;x )//通过算术字符串转换为整数。
{ b[I]=b[I]* 10 BC[lbz-x]-48;
if(x % 4==0){ I ;}//每个单元格存储4位整数。
}
//开始分解:
lbzprintf("=1 ");
while (lcz=lbz)
{ lc2=lcz * 2-1;//2倍除数数字lc2。
//a .未完成,继续分解:
if(lc2lbz||(lc2==lbzc3=q))
{ lbz=lb * 4;lb1=l B- 1;b5=b[lb]* 10000 b[lb1];//a .求被除数的总位数lbz及其前五位数字b5:
if(b[lb]=1000){ b5=b[lb]* 10b[lb1]/1000;}
否则如果(b[lb]=100){ lbz ;b5=b[lb]* 100 b[lb1]/100;}
否则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=磅;x){ y[x]=b[x];}//C .开始做除法:
for(I=lb;i=lcI )
{ y[I]=y[I 1]* 10000;y[I 1]=0;s[I]=0;
而(y[i]c[lc])
{ if(y[I]=214748)ss=y[I]/(c[LC]1);
else ss=(y[I]* 10000y[I-1])/(c[LC]* 10000 c[lc1]1);
if(ss==0)ss=1;
jw=0;s[I]=ss;
for(k=1;k=lc1k)
{ XJ=c[k]* ss jw;
if(XJ=9999)jw=0;else { jw=XJ/10000;xj %=10000}
l=k I-LC;
if(y[l]XJ){ y[l]=10000;y[l 1];}
y[l]-=XJ;
}
XJ=c[LC]* ss jw;
y[I]-=XJ;
}
}
而(y [LC]=c [LC])//D .判断除法是否结束:
{ for(x=LC;x=1;x )
{ if(y[x]c[x])break;//1.如果余数很大,再减去一次。
if(y[x]c[x])转到TC;//2.如果余数很小,请退出除法。
}
s[LC];//3.余数=除数,再减去。
for(x=1;x=lc1十)
{ if(y[x]c[x]){ y[x]=10000;y[x 1];}
y[x]-=c[x];
}
y[LC]-=c[LC];
}
tc:
//e .判断余数是否为0:
对于(x=lcx=1;x )
{ if(y[x]!=0)中断;}
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||g==0)==1
{ g;c[1]=2;}
}
else { g=1;c[1]=2;} //(2)直接加2。
如果(c[1]=10000) //(3)除数单位:
{ c[2];c[1]-=10000;
for(x=2;x=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;}
否则if(c[LC]=100){ lcz ;C3=c[LC];}
否则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 ",c[LC]);//1)输出系数:
for(x=lc1;x=1;x ) printf(" d",c[x ");
对于(x=lcx=lb1X) //2)处理器进位:
{ if(s[x]=10000){ s[x 1];s[x]-=10000;}
}
if(s[lb]==0)lb ;//3)化商为红利:
对于(x=lcx=磅;x){ b[x-lc1]=s[x];}
l B-=lc1;
}
}
//B .分解后,输出最终因子:
其他
{ printf("*%d ",b[lb]);//输出第一个单位。
for(x=lb1;x=1;x ) printf(" d",b[x ");//输出剩余的单元(每4位为1个单元,少于4位之前用0填充)。
打破;
}
}
Printf ("n耗时. 6f秒",(clock()-t0)/1000);//输出运行时间。
返回0;
}
下一篇:没有了