C语言一个程序,希望高手给把代码思路讲解一下!有些地方看不懂

题目为:求出所有这样的三位数,它的2倍,3倍仍然是三位数,这三个三位数使用1到9之间不同的数字。如M=192,2M=384,3M=756!

源代码:#include "stdio.h"
void main()
{
int i,j,k,h,s;
int a[10];
/*int *ak,*m4a1,*mp5;*/
for(i=123;i*3<1000;i++)
{
for(h=1;h<10;h++)
a[h]=0;//请问这部是做什么用的??
a[i/100]=1;//求出各个位的数之后为什么要等于1啊??
a[i/10%10]=1;
a[i%10]=1;
j=i*2;
a[j/100]=1;
a[j/10%10]=1;
a[j%10]=1;
k=i*3;
a[k/100]=1;
a[k/10%10]=1;
a[k%10]=1;
for(s=0,h=1;h<10;h++)//h=1;h<10;h++是控制1-9之间的数字吗?
s=s+a[h];//s=0;s=s+a[h]这部是怎么判断每个位数都不重复的呢?s=0是什么意思啊?
if(s==9)//为什么s==9为真时输出结果呢??
printf("%d %d %d\n",i,j,k);
}

}
请高手能指点迷津啊!!小弟实在有些郁闷啊???

举个例比较好说明,如一个三位数abc
在执行a[h]=0;
a[i/100]=1;
a[i/10%10]=1;
a[i%10]=1;

这就是将a、b、c分离开来分别在a[a],a[b],a[c]中标记为1;
j=i*2;
a[j/100]=1;
a[j/10%10]=1;
a[j%10]=1;
这里是把abc乘以2后依旧把新产生的a1,b1,c1分离开来在相应的a[a1],a[a2],a[a3]中标记为1;
以下j=i*3也是如此。
这里要明白a[]这个数组是干什么的,它表示的意思是,如果a[n]处被标记为1,则数abc及其2倍数,3倍数中必有一位是n;
所以s是计算a[n]中有几个1的,既然要都是不重复的数字,那a[n]中1的个数必须为9,小于9即表示abc及其2倍数、3倍数中至少有2个数字重复标记了一次同一个a[n]为1;
至于开始处的a[h]=0;那是for循环开始处对数组a[]的每一个元素做0初始化,你这样看就能比较明白
for(h=1;h<10;h++)
a[h]=0;
这是删除for循环后部分代码的缩写,它使得a[h]的意义清晰起来,是读复杂程序的常用手法之一,关键在于删除多余部分时不得改变剩下的语句的执行过程;
如还有疑问请补充,如无就给我分吧,全手打,累死我了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-11-07
a数组是记录0到9的数字有没有被使用a[i]==0说明没有被使用, a[1]==1就是用了

for(h=1;h<10;h++) a[h]=0; 是初始化, 刚开始所有都没有被使用

然后
a[i/100]=1;
a[i/10%10]=1;
a[i%10]=1;

是把i拆成个位十位百位, 分别标记对应的数字被使用了

然后i*2, i*3之后, 分别标记

由于 要求是 这三个三位数使用1到9之间不同的数字

所以 这样操作之后, a[1]至a[9]应该全部为1才对, 最后用s去验证是否a[1]到a[9]都是1.

大概就是这样了
相似回答