举个例比较好说明,如一个三位数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]的意义清晰起来,是读复杂程序的常用手法之一,关键在于删除多余部分时不得改变剩下的语句的执行过程;
如还有疑问请补充,如无就给我分吧,全手打,累死我了
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.
大概就是这样了