0

嘿,我想把我的六位数 int 变成一个字符串。我目前的代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Euler_4
{
    class Program
    {
        static void Main(string[] args)
        {
            string snum;
            int num;
            string final = "nul";
            char first;
            char second;
            for (int i = 100, h = 100; i < 999; i++, h++)
            {
                num = i * h;
                snum = num.ToString();
                first = snum[0];
                second = snum.ToCharArray()[5]; //Line of interest
                if (first == second)
                {
                    final = snum;
                }
            }
            Console.WriteLine(final);
            Console.ReadLine();

        }
    }
}

问题是当我尝试运行它时它不断返回索引超出范围异常。如果它从 0 开始,那么第六位数字不是 [5] 并且 [4] 返回第五位数字,所以我在这里不知所措。

4

3 回答 3

1
100 * 100 = 10000
            01234 <- array indexes.

中只有五位数字10000,见上文。索引范围从 0 到 4,因此尝试提取索引 5 会让您感到悲伤。

如果你想检查第一个和最后一个数字是否相等,第一个可以通过简单的循环获得,最后一个可以通过模运算符找到:

int firstDigit = num;
while (firstDigit / 10 > 0) firstDigit /= 10;
int lastDigit = num % 10;

这样您就可以比较它们,而无需先将它们转换为字符串的相对昂贵的操作(相信我,这不是您想要为欧拉问题做的事情)。

您甚至可以优化该循环,因为您知道所有候选数字都是五位数或六位数:

int firstDigit;
if (num < 100000) firstDigit = num /  10000;
else              firstDigit = num / 100000;
int lastDigit = num % 10;
于 2013-04-16T04:13:58.537 回答
0

尝试这个

for (int i = 100, h = 100; i < 999; i++, h++)
    {
        num = i * h;
        snum = num.ToString();
        first = snum.ToCharArray()[0];
        second = snum.ToCharArray()[4];
        if (snum.ToCharArray().Length > 5)
        {
            second = snum.ToCharArray()[5]; //Line of interest
        }
        if (first == second)
        {
            final = snum;
        }
    }
于 2013-04-16T04:19:56.633 回答
0

自 100*100 == 10000 以来第一次迭代的 Num 将为 5 位,它存储为长度为 5 的字符串。由于数组索引为 0,因此您的字符串只能索引 0-4

[5] 将超出范围,因为这将假定一个长度为 6 的字符串

于 2013-04-16T04:15:21.310 回答