我是云的程序的确是做的很巧妙,也很高效。我的理解见下面的注释:
//将1-9这九个数字分别填入一个3×3方阵,这样使每一横行的三个数字组成一个三位数。
//如果要使第二行的三位数是第一行的两倍,第三行的三位数是第一行的三倍应怎样填数。编程打印所有方案。
#include <stdio.h>
#include <stdlib.h>
//======= checkChar() 的功能是:判断 n传入的数中是否有重复数字
int checkChar(int n)
{
char flag[10]={0}, //数组flag[10]:flag[0]--flag[9]分别存放0--9这10个数字的个数。
num[10]={0}; //数组num[10]: 将n传入的数转化为字符串放入数组num[10]。
itoa(n, num, 10); //itoa(n, num, 10); 将n传入的数转化为字符串放入数组num.(10: 最大长度。)
for(int i=0;i<9;flag[num[i]-'0']++,i++) //检测:是否有重复的数字。第一次出现的字符,使得flag[num[i]-'0']++, 如果此字符再次出现,必然已经有 flag[num[i]-'0']=1了,
if(flag[num[i]-'0']) return 0; //当flag[num[i]-'0']非0时,此数字必定是重复出现,所以return 0
return 1; //如果数组num中的9个数字没有重复,才会执行到这里,所以return 1
}
void main(void)
{
for(int a=123;a<=329;a++) //因为123是各数位不同的最小三位数,329是329*3不超出1000的最高界
if(checkChar(a*1000000+a*2*1000+a*3)) //将a 2*a 3*a 做成一个9位数
printf("%d\n%d\n%d\n\n", a, a*2, a*3);
}
另外,我试了一下:并不是“flag[] 无论赋什么初值,只要是赋过值,就会有正确输出”,只有它都赋为0才对,我认为可以理解它是记录各数字字符的个数的。flag[0]记录‘0’的个数,flag[1]记录‘1’的个数,...,
//将1-9这九个数字分别填入一个3×3方阵,这样使每一横行的三个数字组成一个三位数。
//如果要使第二行的三位数是第一行的两倍,第三行的三位数是第一行的三倍应怎样填数。编程打印所有方案。
#include <stdio.h>
#include <stdlib.h>
//======= checkChar() 的功能是:判断 n传入的数中是否有重复数字
int checkChar(int n)
{
char flag[10]={0}, //数组flag[10]:flag[0]--flag[9]分别存放0--9这10个数字的个数。
num[10]={0}; //数组num[10]: 将n传入的数转化为字符串放入数组num[10]。
itoa(n, num, 10); //itoa(n, num, 10); 将n传入的数转化为字符串放入数组num.(10: 最大长度。)
for(int i=0;i<9;flag[num[i]-'0']++,i++) //检测:是否有重复的数字。第一次出现的字符,使得flag[num[i]-'0']++, 如果此字符再次出现,必然已经有 flag[num[i]-'0']=1了,
if(flag[num[i]-'0']) return 0; //当flag[num[i]-'0']非0时,此数字必定是重复出现,所以return 0
return 1; //如果数组num中的9个数字没有重复,才会执行到这里,所以return 1
}
void main(void)
{
for(int a=123;a<=329;a++) //因为123是各数位不同的最小三位数,329是329*3不超出1000的最高界
if(checkChar(a*1000000+a*2*1000+a*3)) //将a 2*a 3*a 做成一个9位数
printf("%d\n%d\n%d\n\n", a, a*2, a*3);
}
另外,我试了一下:并不是“flag[] 无论赋什么初值,只要是赋过值,就会有正确输出”,只有它都赋为0才对,我认为可以理解它是记录各数字字符的个数的。flag[0]记录‘0’的个数,flag[1]记录‘1’的个数,...,