在线分解质因数软件_因式分解计算器在线使用方法

在线分解质因数软件_因式分解计算器在线使用方法,第1张

在线分解质因数软件_因式分解计算器在线使用方法 一、特点:可以分解任意超大数。

二、运算结果展示:(用数组的1个单元存储4位整数)三、用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; //被除数b,除数c,商s,余数y,新积xjint i,k,x,lbz,lb,lcz=1,lc=1; //循环变量i,k,x;被除数总位数lbz,单元数lb;除数总位数lcz,单元数lcint jw,ss,l,g=0,jr=0; //进位jw,试商ss,积的单元数l,质数个数g,进入指示jrint 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,单元数lbfor(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||(lc2==lbz&&c3<=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位的算术根qfor(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)直接加2if(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;}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/646918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-17
下一篇 2022-04-17

发表评论

登录后才能评论

评论列表(0条)

保存