水題:

將1,2...9共9個數分成三組,分別組成三個三位數,且使這三個三位數構成1:2:3的比例,試求出所有滿足條件的三個三位數。


思路:

1.由於規模很小,不到1000,所以採用窮舉的思想。

2.儘量優化:因爲1-9數字不重複,所以循環從123開始,而最大的數爲3×i=987。

3.對於每一個三位數i,設一個num數組,用來記錄1-9中9個數字使用與否。

memset函數用法(百度百科)、頭文件<string.h>:

void *memset(void *s, int ch, size_t n);

函數解釋:將s中前n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s 。
memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體數組進行清零操作的一種最快方法[1] 
4.對於三位數i,有j=i×2,k=i×3要研究,把i,j,k中的每位數分解開,得出,9個數,在num數組中把出現的數字標記爲1。

統計num數組中共有多少個爲1的數字,即可知道i,j,l是否都爲不重複的數字。

#include <stdio.h>
#include <string.h>

int main()
{
	int n,i,j,k,h, sum;
	int num[10];
	for(i=123; i*3<987; i++)
	{
		memset(num,0,10*sizeof(num[0]));
		num[i/100] = 1;
		num[i/10%10] = 1;
		num[i%10] = 1;
		j = i * 2;
		num[j/100] = 1;
		num[j/10%10] = 1;
		num[j%10] = 1;
		k = i * 3;
		num[k/100] = 1;
		num[k/10%10] = 1;
		num[k%10] = 1;
		sum = 0;
		for(h=1; h<10; h++)
		{
			sum += num[h];
		}
		if(sum == 9)
			printf("%d %d %d\n",i,j,k);
	}
	return 0;
}


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