因式分解計算器在線使用方法「在線分解質因數軟件」

一、特點:可以分解任意超大數。

二、運算結果展示:(用數組的1個單元存儲4位整數)

C語言分解質因數(對任意超大數)

三、用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,新積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,被除數的前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(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位的算術根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;

}

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/268341.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-16 13:09
下一篇 2024-12-16 13:09

相關推薦

發表回復

登錄後才能評論