Отабек Мансуров Ответов: 3

Почему делают математику неправильно? Например, если n = 301


string n = Console.ReadLine();
            string m = "";
            for (int i = n.Length - 1; i >= 0; i--)
            {
                m = m + n[i];
            }
            Console.WriteLine("Added number in reverse order: " + m + "\n");
            Console.WriteLine("The result should have been so if the n = 103(i.e reverse view 301):");
            Console.WriteLine("1 * (8^0) = " + (1 * Math.Pow(8, 0)));
            Console.WriteLine("0 * (8^1) = " + (0 * Math.Pow(8, 1)));
            Console.WriteLine("3 * (8^2) = " + (3 * Math.Pow(8, 2)));
            Console.WriteLine("Summ = 1 + 0 + 192 = 193 - correct result");
            double s = 0, s1 = 0;
            Console.WriteLine("\nStarting cycle:\n");
            for (int i = 0; i < m.Length; i++)
            {
                Console.Write(i + " cycle = ");
                s1 = Convert.ToInt64(m[i]) * Math.Pow(8, i);
                Console.WriteLine(s1);
                s = s + (Convert.ToInt32(m[i]) * Math.Pow(8, i));
            }
            Console.WriteLine("Summ = " + s +" - uncorrect result");
            Console.ReadKey();


Что я уже пробовал:

Может быть, есть проблема при преобразовании переменной?. Помоги мне, умоляю!

Philippe Mori

Используя отладчик, было бы очень легко разобраться в проблеме.

Afzaal Ahmad Zeeshan

Вы должны знать, что строка 301 не равна целому числу 301.

3 Ответов

Рейтинг:
20

Jochen Arndt

Вы используете Convert.ToInt(char). Это вернет значение символа (например, символ '1' имеет значение 0x31 / 49).
Видеть Преобразовать.Метод ToInt32 (Char) (System)[^]:

Цитата:
Метод ToInt32(Char) возвращает 32-разрядное целое число со знаком, представляющее кодовую единицу аргумента value в кодировке UTF-16. Если значение не является низким суррогатом или высоким суррогатом, это возвращаемое значение также представляет кодовую точку значения Unicode.


Но вы хотите, чтобы число было представлено символом. Если вы знаете, что символ-это цифра, вы можете получить число, вычитая "0":
s1 = Convert.ToInt64(m[i] - '0') * Math.Pow(8, i);


Рейтинг:
2

Patrice T

В C / C++C# используется метод преобразования '3' к 3 не использовать convert функция, она заключается в использовании '3'-'0'.

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

Sayed Shabie Abbas

Используйте следующий фрагмент кода.
m [i] возвращает символ. Поэтому, когда вы преобразуете его в целое число, он фактически возвращает ASCII-значение числа. таким образом, " 1 " становится 49.
Просто преобразуйте его в строку, и все должно работать нормально.

for (int i = 0; i < m.Length; i++)
{
Console.Write(i + " cycle = ");
s1 = Convert.ToInt64(m[i].ToString()) * Math.Pow(8, i);
Console.WriteLine(s1);
s = s + (Convert.ToInt32(m[i].ToString()) * Math.Pow(8, i));
}


Примечание: М является строкой, а м[я] например: М[0]= '1' это символ.