在线分解质因数软件
作者:king发布时间:2023-08-06分类:日常常识浏览:47
导读:一、特点:可以分解任意超大数。二、运算结果展示:(用数组的1个单元[单元:指整体中自为一组或自成系统的独立单位,不可再分,也不可叠加,否则就改变了事物的性质。]存储4位整数[整...
一、特点:可以分解任意超大数。
二、运算结果展示:(用数组的1个单元[单元:指整体中自为一组或自成系统的独立单位,不可再分,也不可叠加,否则就改变了事物的性质。]存储4位整数[整数(Integer):像-2,-1,0,1,2这样的数称为整数。])
三、用C语言编程如下:
//分解超大数4(每单元存储4位整数)
#include stdio.h //输入输出[媒介由内部到外部的传递过程。]头函数
#include string.h //字符串头函数
#include math.h //数学头函数
#include time.h //日期时间头函数
#define N 50 //数组尺寸大小
main ()
{ unsigned bz[N*4]={},b[N]={},c[N]={0,2},s[N]={},y[N*2]={},xj; //被除数[除数(divisor)是一个数学概念,在除法算式中,除号后面的数叫做除数。]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,质数[质数(prime number)又称素数,有无限个。]个数g,进入指示jr
int lb1,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,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);
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位整数
}
// 开始分解:
lbz++;printf( = 1);
while (lcz=lbz)
{ lc2=lcz*2-1; //除数位数的2倍lc2
// A.没有分解完,继续分解:
if(lc2lbz||(lc2==lbzc3=q))
{ 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.求被除数前5位的算术根q
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]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=1;x)
{ if(y[x]c[x]) break; //1.余数大的再去减一遍
if(y[x]c[x]) goto tc; //2.余数小的退出除法
}
s[lc]++; //3.余数 = 除数,再减一遍
for(x=1;x=lc1;x++)
{ 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=1;x)
{ if(y[x]!=0) break;}
if(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=lc;x++) { if(c[x]=10000){c[x+1]++;c[x]-=10000;} }
if(c[lc+1]=1) lc++;
lcz=lc*4; lc1=lc-1;//取除数的前3位c3:
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( %04d,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( %04d,b[x]); //输出剩余单元(每4位为1单元,不足4位前面补0)
break;
}
}
printf(n用时%.6f秒,(clock()-t0)/1000); //输出运行时间
return 0;
}

- 上一篇:杭州雨季
- 下一篇:520送榴莲是什么意思
- 日常常识排行