算法---001

题目:用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;
        }
    }

posted @ 2014-03-25 17:34  KyrieYang  阅读(382)  评论(0编辑  收藏  举报