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