分解質因數

問題描述
  求出區間[a,b]中所有整數的質因數分解。
輸入格式
  輸入兩個整數a,b。
輸出格式
  每行輸出一個數的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是從小到大的)(具體可看樣例)
樣例輸入
3 10
樣例輸出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
  先篩出所有素數,然後再分解。
數據規模和約定
  2<=a<=b<=10000
 思路:先用函數求出10000以內的質數,存到數組裏。然後用雙層循環,外層控制[a,b]範圍,內層有三個,第一個循環作用是直接輸出[a,b]範圍內的質數,第二個循環的作用是對非質數的數進行一個判斷處理,判斷思路:對要分解的數進行除法操作,然後在用if語句判斷是否可以整除,如果可以整除,我們將存到數組裏(輸出格式需要,我也不知道怎麼處理這種輸出格式,只能用這種笨方法)。假設這個數字第一次可以被(爲了方便理解,我用2代替一下)2整除,那麼第二次它也同樣可能2整除,所以我們要將第二個循環從新由2的下標開始循環。這裏我是用if加上0和1的方式判斷條件,當然整篇代碼都用了不少這樣的例子。第三個循環是對第二個循環求出的值按照題目給出的標準的輸出格式輸出。(小白還請多多關照)
#include <stdio.h>
#include <windows.h>

int fun22(int * a)
{
	int i, j, m = 0, true_ = 0;
	
	for(i = 2; i < 10000; i++)
	{
		true_ = 0;
		for(j = 2; j < i / 2 + 1; j++)
		{
			if(i % j == 0)
				true_ = 1;	
		}
		if(!true_)
			a[m++] = i;	
	}
	return m;
}

void fun21(void)
{
	int n, m, x, y;
	int i, j, true_;
	int a[5000], k, b[10000], kk = 0;
	
	scanf("%d%d", &n, &m);
	k = fun22(a);
	for(n ; n <= m; n++)
	{
		j = n;	true_ = 0;
		for(i = 0; i < k; i++)
		{
			if(n == a[i])
			{
				printf("%d=%d\n", n, n);
				true_ = 1;
				break;
			}		
		}
		if(true_)
			continue;
		memset(b, 0, sizeof(b));
		kk = 0; i = 0;
		while (i < k)
		{
			x = j / a[i];
			true_ = 0;
			if(j == a[i] * x)
			{
				j = x;
				
				b[kk++] = a[i];
				y = j / a[i]; 	
				if(j != 0 && j == y * a[i])
					true_ = 1;			
			}
			if(j == 0 || a[i] > n)
				break; 
			if(true_)
				i = 0;
			else
				i++; 
		}
		printf("%d=", n);
		for(i = 0; i < kk; i++)
		{
			if(i == kk - 1)
				printf("%d", b[i]);
			else 
				printf("%d*", b[i]);
                        //printf("%d%c", b[i], n == kk - 1 ? '*': '');
		}
		if(n < m)
			printf("\n");
	}
}

int main()
{	
	system("color 0a");	
	fun21();
	return 0;
}


 
發佈了28 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章