2013-04-16 5 views
1

Эй, я хочу превратить свой шестизначный int в строку. Мой текущий код:int to string, string number number error

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] вернет пятую цифру, чтобы я был здесь в убытке.

+0

Вам не нужен 'ToCharArray'. Индексатор 'string' будет выполнять эту работу уже. –

+0

Почему бы вам просто не использовать 'ToString()'? –

ответ

1
100 * 100 = 10000 
     <- 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; 
0

Num будет 5 цифр для первой итерации, так как 100 * 100 == 10000, который хранится как строка длины 5. так как массивы 0 индексных ваша строка может быть проиндексированы только 0-4

[5] будет вне пределов, так что было бы предположить строку длины 6

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; 
     } 
    } 
+0

Длина смина должна быть проверена перед назначением первой и второй ....... – vikky