質因數分解函數

編寫函數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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章