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());
}
}
}
我的思路是设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());
}
}
}
或者用LInQ的group by
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;
}
{
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;
}
{
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,说明不符合要求。
{
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);
}
}
}