题目:用1、2、3、4、5、6、7、8、9九个数字拼成一个九位数(每
个数字恰好用一次),使得它的前三位、中间三位、最后三位的比值是1 : 2 : 3。例
如192384576就是一个合法的解,因为192 : 384 : 576 = 1 : 2 : 3
看到这种要求一般会想到 这种逻辑
var m1 = x * 100 + y * 10 + z; //前三位数
var m2 = m1 * 2;
var m3 = m1 * 3;
而每个数都是从1-9之间取 所以会产生各种排序组合
for(int x=1;x<10;x++) // 12 13 14
{
for(int y=1;y<10;y++){
for(int z=1;z<10;z++){
}
}
}
稍微分析一下了,还是上代码,代码只现实现功能,没有什么复杂时间度,性能,以后算法学好在优化
class Program { static void Main(string[] args) { for (int x = 1; x <10; x++) //1到9 { for (int y = 1; y <10; y++) { if (x == y) continue; for (int z = 1; z <10; z++) { if(x==y||y==z||x==z) continue;// 确保无重复 var m1 = x * 100 + y * 10 + z; //前三位数 var m2 = m1 * 2; var m3 = m1 * 3; if (m3 >= 1000) continue;//跳出 if (!m1.ToString().Contains("0") && !m2.ToString().Contains("0") && !m3.ToString().Contains("0")) { var s = m1.ToString() + m2.ToString() + m3.ToString(); //但是s里面可能有重复的,所以也要判断一下 if (CompareCC(s) > 0) continue; Console.WriteLine("这个数是:" + s); } } } } } public static int CompareCC(string s) { int count = 0; for (int i = 0; i <s.Length; i++) { for (int j = 1; j <s.Length; j++) { if (i == j) continue; if (s.Substring(i, 1) == s.Substring(j, 1)) //同位置字符串是否相同 { count++; } } } return count; } }