1、 找出111111111 – 999999999中符合以下条件的9位数,9位数的中间三位是前三位的2倍,最后三位是前三位的3倍,并且这9个数的每位只能是1-9,不能重复
我的思路是设int a=111;然后用循环加,没循环一次,就判断,如果a里面的数据包含1-9中任意3个数字并且不重复的话就求int b,在用if判断int b,以此再求int c;但如何判断变量的值中包含1-9并且数字不重复呢??????????
  例如: int a=111;
            int b=0;
            int c=0;
            for (a = 111; a < 999;a++ ) 
            {
               
                b = a * 2;
                if (b >= 111 && b <= 999)
                {
                    c = a * 3;
                    if(c >=111 && c<=999)
                    {
                          Console.WriteLine(a.ToString()+b.ToString()+c.ToString());
                    }
                }
               
            }

解决方案 »

  1.   

    可以单独写个函数,从第一个数字往后遍历,接着从第二个往后,如果找到一样的就是有重复
    或者用LInQ的group by
      

  2.   


            static void Main(string[] args)
            {
                int a = 111;
                int b = 0;
                int c = 0;
                for (a = 112; a < 999; a++)
                {
                    b = a * 2;
                    c = a * 3;
                    if(CheckNumber(a) && CheckNumber(b) && CheckNumber(c))
                        Console.WriteLine("{0}{1}{2}", a, b, c);
                }
                Console.Read();
            }        private static bool CheckNumber(int number)
            {
                if (number.ToString().IndexOf("0") >= 0)
                    return false;
                int bai = number / 100;
                int shi = number / 10 % 10;
                int ge = number % 10;
                if(bai == shi && shi == ge)
                    return false;            if (number >= 999)
                    return false;            return true;
            }
      

  3.   

            static void Main(string[] args)
            {
                int a = 111;
                int b = 0;
                int c = 0;
                for (a = 112; a < 333; a++)
                {
                    b = a * 2;
                    c = a * 3;
                    if(CheckNumber(a) && CheckNumber(b) && CheckNumber(c))
                        Console.WriteLine("{0}{1}{2}", a, b, c);
                }
                Console.Read();
            }        private static bool CheckNumber(int number)
            {
                if (number.ToString().IndexOf("0") >= 0)
                    return false;
                int bai = number / 100;
                int shi = number / 10 % 10;
                int ge = number % 10;
                if(bai == shi && shi == ge)
                    return false;            if (number >= 999)
                    return false;            return true;
            }
      

  4.   

    比较有效率的写法:        static bool IsValid(params int[] numbers)
            {
                bool[] slots = new bool[10];
                foreach (var n in numbers)
                {
                    var num = n;
                    while (num > 0)
                    {
                        var digit = num % 10;
                        if (slots[digit]) return false;
                        else slots[digit] = true;
                        num = num / 10;
                    }
                }            return true;
            }        static void Main(string[] args)
            {
                for (int b = 123 * 2; b <= 987 / 3 * 2; b += 2)
                {
                    var a = b / 2;
                    var c = a * 3;
                    if (IsValid(a, b, c))
                    {
                        Console.WriteLine("a={0}, b={1}, c={2}", a, b, c);
                    }
                }
             }首先我是用b作为循环变量的,b的最小值是123*2(因为a最小是123),c的最大值是987,因此a的最大值是987/3,因此b的最大值是987/3*2,同时b肯定是偶数,每次b = b+2。这样的循环应该是最优的。对于每次循环的b,算出a和c。然后检查a b c是否满足条件(通过IsValid方法)。IsValid方法里,我设置了一个bool[]数组,然后对a b c分别进行拆分,如果某个数字出现过,就把对应的bool值设置成true。这样一旦出现重复,就立刻return false,说明不符合要求。
      

  5.   

            static bool IsValid(params int[] numbers)
            {
                bool[] slots = new bool[10];
                foreach (var n in numbers)
                {
                    var num = n;
                    while (num > 0)
                    {
                        var digit = num % 10;
                        if (slots[digit]) return false;
                        else slots[digit] = true;
                        num = num / 10;
                    }
                }            return true;
            }        static void Main(string[] args)
            {
                for (int b = 123 * 2; b <= 987 / 3 * 2; b += 2)
                {
                    var a = b / 2;
                    var c = a * 3;
                    if (IsValid(a, b, c))
                    {
                        Console.WriteLine("a={0}, b={1}, c={2}", a, b, c);
                    }
                }
             }