//分解質因數程序:把區間[m,n]的整數分解為标準形式(其中m,n為自然數且1<=m<=n<2^31)
#include <stdio.h> /*包含輸入輸出函數*/
#include <math.h> /*包含數學函數*/
int main () /*主函數*/
{ int z[4793]={2}; //因小于2^31的平方根的素數有4392個
int i,x,g=1,b,q,m,n; //循環變量i,數組下标x,素數個數g,被分解數b,平方根q,範圍[m,n]
for(i=3;i<=46349;i =2) //因46349^2已經大于2^31
{ x=0;q=sqrt(i); //每次都從z[0]開始檢驗
while (i%z[x]!=0) //如i不能被z[x]整除時一直檢驗
{ if(z[x]<=q) x ; //不能确定是素數時:用數組中的下一個素數檢驗
else //确定是素數時:
{ z[g]=i;g ; //保存該素數,素數總個數加1,
break; //退出内循環:檢驗下一個i
}
}
}
printf("請輸入要分解的整數範圍m n(用空格隔開):");scanf("%d %d",&m,&n);
for(i=m;i<=n;i )
{ printf("\n%d=1",i);
x=0;b=i; //每次都從z[0]起檢驗;把i先給被除數b
while(b>1) //沒有分解完繼續
{ g=0;q=sqrt(b); //相同因數個數g置0;
if(z[x]>q){printf("*%d",b);break;} //把i分解完了退出,分解下一個數
while (b%z[x]==0){g ;b/=z[x];} //反複用z[x]去除,并累計能整除的次數 ,直到不能整除
if(g>0)printf("*%d",z[x]); //z[x]是p的因數時,打印z[x]
if(g>1)printf("^%d",g); //相同因數多于一個時,打印因數個數
x ; //用下一個素數檢驗
}
}
return 0;
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!