仅使用循环求解

时间:2015-11-13 02:47:43

标签: c# c#-4.0

数字124具有这样的属性:它是最小的数字,其前三个数字包含数字2.观察它 124 * 1 = 124,124 * 2 = 248,124 * 3 = 372且124,248和372各包含数字2.可以将此属性概括为最小数字,其前n个倍数各自包含数字2.编写一个名为smallest(n)的函数,它返回前n个倍数包含数字2的最小数字。提示:使用模10来算术来检查数字。

它的签名是 int smallest(int n)

实例 如果n是返回因为 4 624因为624的前四个倍数是624,1248,1872,2496并且它们都包含 数字2.此外,624是最小的数字,其前四个倍数包含数字2。 5 624因为624的前五个倍数是624,1248,1872,2496,3120。注意624也是 前4个倍数包含数字2的最小数字。 6 642因为642的前五个倍数是642,1284,1926,2568,3210,3852 7 4062因为4062的前五个倍数是4062,8124,12186,16248,20310,24372,28434。 注意,其中一个倍数可以多次包含数字2(例如,24372)。

我试图通过这种方式解决这个问题

//Its a incomplete code    
public static int smallest(int n)
            {
                int i = 1;
                for (; ; )
                {
                    int temp = 0;
                    int myNum = 0;
                    for (int j = 1; j <= n; j++)
                    {
                        myNum = i * j;
                        //check for condition
                    }
                    //if condition ture break
                }
            }

但是我坚持这个问题是我无法创建n次变量的硬编码..你能帮助我继续吗?

您可以假设这样的数字可以在32位机器上计算,即您不必在答案中检测整数溢出。

3 个答案:

答案 0 :(得分:0)

public static int smallest(int n)
    {
        int i = 1;
        for (; ; )
        {
            int contain = 0;
            int temp = 0;
            int myNum = 0;
            for (int j = 1; j <= n; j++)
            {
                myNum = i * j;
                temp = myNum;

                while (true)
                {
                    if (temp % 10 == 2)
                    {
                        contain++;
                        break;
                    }

                    temp = temp / 10;
                    if (temp <= 0)
                        break;
                }
            }
            if (contain == n)
                break;
            i++;

        }
        return i;
    }

答案 1 :(得分:0)

numberOfRowsInSection

答案 2 :(得分:0)

// Function smallest n
 public int smallest(int a)
        {
            int temp = 0, holder = 0, k = 0;
            if (a <= 0) return 0;
            else
            {
                for (int i = 100; i < Int16.MaxValue; i++)
                {
                    int count = 0;
                    k = 0;
                    int[] array = new int[a];
                    for (int j = 1; j < 9; j++)
                    {
                        holder = i * j;
                        temp = holder;
                        while (temp > 0)
                        {
                            int rem = temp % 10;
                            if (rem == 2)
                            {
                                count++;
                                if (k < a)
                                {
                                    array[k] = j;
                                    k++;
                                    break;
                                }
                            }
                            temp /= 10;
                        }
                        if (count == a)
                        {
                            int countTemp = 0;
                            for (int h = 0; h < a; h++)
                            {
                                if (h + 1 < a)
                                {
                                    if (array[h + 1] == array[h] + 1 && array[0] == 1 && array[h] > 0)
                                    {
                                        countTemp++;
                                        if (countTemp == a - 1)
                                            return i;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return 0;
        }