編寫函數void func(unsinged int n),實現計算並輸出一個正整數的質因數分解式。例如:n爲90時,輸出90=2*3*3*5。
①是素數就輸出:
可能直接想着先要做個判斷了,如果是素數判斷結束,輸出這個素數。如果不是,在進入下面的分解的步驟吧。
但是,有沒有人想過素數的定義是什麼?素數是一類只能被1或自身整除的數字對吧?如果去掉之前的這個判斷,直接在接下來的分解步驟中去判斷會怎樣?
假如輸入了“11”,“11”是個素數,只能被1和11整除。那麼,設置除數從2開始,是不是從2到10爲止都沒法整除呢?等到了11,11除以11剛好是1,這時候輸出11。是不是和上面的判斷的結果一樣呢?
②、輸出質因數的分解式,除數是素數:
在這裏可能會有人會疑惑了,如果只用素數整除,是不是應該寫個函數去輸出素數呢?從2開始,3、5、7、11這樣的去循環輸出着素數。假如除不盡2就換3,以此類推。
如果真的這樣去想,源碼不僅會寫的特別繁雜不說,還要經過反反覆覆的調試。那麼,有沒有更簡單的方法呢?
假如,輸入一個數字24。24可以分解成3X8或者4X6對吧?但是我們按照①的想法走,第一個除數是2,那麼3X8就直接出局了。可能有人會想,24除2得到12,2加1是3,12除以3是4,3再加1是4,除數中有非素數了,不對啊!!!!!!況且4還能拆分成兩個2啊?!
那麼,可以在除以2的時候做個判斷啊,如果第一次除後的所得的商能繼續被2所整除,那除數就先不要加1就好了嘛!直到除不盡了,換下一個,以此類推。
如果到4了呢?豈不是要出現非素數嗎?
不可能的,依照上面的想法,除數在沒法整除後依次累加,得到的所有的除數只可能是素數。因爲4在到達它之前,已經拆分成兩個2了。如果是18,第一次得9,也就不會出現9,因爲在9的前面已經有了3X3搞定了!!!
因此,這道題無非就是考一個累除法的編寫。
#include <stdio.h>
#include <string.h>
void func(unsigned int n)
{
int i=2,flag=0;
while(n>=2) {
if(n%i==0) {
if(flag==1)
printf("*");
printf("%d",i);
n=n/i;
flag=1;
} else {
i++;
}
}
printf("\n");
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
func(n);
return 0;
}
思路參考:https://blog.csdn.net/Issac_X10A/article/details/81773427