用 1,2,3 …9组成三个数字abc,def,ghi每个数字恰好使用一次,要求 abc:def:ghi = 1:2:3按照 abc def ghi 的格式输出所有解 ,每行一个解。
思路 :有a,b,c三个变量,先确定a的范围,最小的数且符合题目规定的数字为123,最大的数字且符合题目规定的数字是987 ,所以a的范围是 123 ~ 329(987/3).最简单的确定比例的做法就是将其乘以某数,所以b = 2a,c=3a;比例的问题怎么确定?最简单的方法就是采用判断;首先a的各位数字不能相等,其次b的各位数字不能相等且不能等于a的各位数字,最后c的各位数字不能相等且不能等于a和b的各位数字(a,b,c的各位数字都不能出现0)
#include <stdio.h>
int main(){
int a=101,b,c;
while(a < 330){
if( a%10==a/100 || a%10==a/10%10 || a/100==a/10%10
&& a%10 != 0 && a/10%10!=0 && a/100 !=0 ){
a++;
continue ;
}
b = a * 2 ;
c = a * 3 ;
if(b/a==2 && b%a==0){
if(b%10 !=a%10 &&b%10 != a/10%10 &&b%10!=a/100 && //b的个位不等于a的各位数字
b/10%10 !=a%10 && b/10%10 != a/10%10 && b/10%10!=a/100 && //b的十位不等于a的各位
b/100 !=a%10 && b/100 != a/10%10 && b/100!=a/100 //b的百位不等于a的各位
&& b%10!=b/10%10 && b%10!=b/100 && b/10%10!=b/100 //b的每位数字互不相等
&& b%10 != 0 && b/10%10!=0 && b/100 !=0 //b的各位数字不等于零
){
if(c%10 !=a%10 &&c%10 != a/10%10 &&c%10!=a/100 //c的每位数字都不等于a和b的每位数字
&&c/10%10 !=a%10 && c/10%10 != a/10%10 && c/10%10!=a/100
&&c/100 !=a%10 && c/100 != a/10%10 && c/100!=a/100
&&c%10 !=b%10 &&c%10 != b/10%10 &&c%10!=b/100
&&c/10%10 !=b%10 && c/10%10 != b/10%10 && c/10%10!=b/100
&&c/100 !=b%10 && c/100 != b/10%10 && c/100!=b/100
&& c%10!=c/10%10 && c%10!=c/100 && c/10%10!=c/100 //c的每位互不相等
&&c%10 != 0 && c/10%10!=0 && c/100 !=0){ //c的每位不等于0
printf("a:%d b:%d c:%d\n",a,b,c);
}
}
}
a++;
}
return 0;
}
其实这个方法确实有点麻烦
看了很多办法,其中有的人采用将a,b,c每个数字加起来看是否等于45(1+2+3+…+9),这个方法有漏洞,加起来和等45的组合有很多;借鉴了一下别人的方法保证每个数字只会出现一次就是将a,b,c的每个数保存到一个数组中,从小到大进行排序,接着判断相邻的两个数字是否相等,并且要保证数组的每个数字不等于零。
TOPsnap 的原文链接:点击这里
源码:
#include <stdio.h>
int main(){
int a = 123 ,b,c,i,j;
int array[9];
while(a < 329){
b = a*2;
c = a*3;
array[0] = a%10 ; array[1] = a/10%10; array[2] = a/100;
array[3] = b%10 ; array[4] = b/10%10; array[5] = b/100;
array[6] = c%10 ; array[7] = c/10%10; array[8] = c/100;
for(i=0;i<9;i++){
for(j=i+1;j<9;j++){
if(array[i]>array[j]){
int temp = array[i];
array[i] = array[j];
array[j] = temp ;
}
}
}
for(i=0,j=1;i<9&&j<9;i++,j++){
if(array[i] == array[j] ||array[i]==0 || array[j]==0) break;
}
if(j == 9)printf("%d %d %d\n",a,b,c);
a++;
}
return 0;
}