int to string,string index number error

时间:2013-04-16 04:10:27

标签: c#

嘿,我想将我的六位数字转换为字符串。我目前的代码是:

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]会返回第五个数字所以我在这里不知所措。

3 个答案:

答案 0 :(得分:1)

100 * 100 = 10000
            01234 <- array indexes.

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

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

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

这样你可以比较它们而不需要先把它们变成字符串的相对昂贵的操作(相信我,这不是你想要为Euler问题做的事情)。

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

int firstDigit;
if (num < 100000) firstDigit = num /  10000;
else              firstDigit = num / 100000;
int lastDigit = num % 10;

答案 1 :(得分:0)

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

[5]将超出界限,因为这将假设一个长度为6的字符串

答案 2 :(得分: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;
        }
    }