將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;
}