Как мне преобразовать символ из строки в double и более? - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужна программа, которая сообщает мне все числа дисариума , меньшие, чем пользовательское число от 10 до 1.000.000 (если возможно, от 10 до бесконечности).Несмотря на то, что vs не отображает никаких ошибок в редакторе, при запуске он отображает следующее сообщение об ошибке: «System.InvalidCastException:« Неверное приведение от Char до Double ».» В одном из

calculation = Math.Pow(Convert.ToDouble(strI[0]), 1.0);

Я пробовал другие методы, чтобы преобразовать символы в двойники, но они выдают те же или другие сообщения об ошибках или неправильно их преобразовывают.Кроме того, я почти уверен, что могу использовать более компактный метод, чем оператор switch, чтобы определить количество цифр в номере (может быть, что-то, что читает длину числа?), Но не знаю как.

//prints out all the disarium numbers lower than a user defined number
static void Main(string[] args)
{
    //assigns the variables
    string number , strI;
    double calculation = 0;

    //asks the user for string number
    Console.WriteLine("Give a number between 10 and 1.000.000. This program will tell you all the disarium numbers lower than the given number.");
    number = Console.ReadLine();

    //calcules all the disarium numbers lower than string number
    for (int I = 10;I < Convert.ToInt32(number);I++)
    {
        strI = Convert.ToString(I);
        switch (strI.Length)
        {
            case 1:
                calculation = Math.Pow(Convert.ToDouble(strI[0]), 1.0);
                break;
            case 2:
                calculation = Math.Pow(Convert.ToDouble(strI[0]), 1.0) + Math.Pow(Convert.ToDouble(strI[1]), 2.0);
                break;
            case 3:
                calculation = Math.Pow(Convert.ToDouble(strI[0]), 1.0) + Math.Pow(Convert.ToDouble(strI[1]), 2.0) + Math.Pow(Convert.ToDouble(strI[2]), 3.0);
                break;
            case 4:
                calculation = Math.Pow(Convert.ToDouble(strI[0]), 1.0) + Math.Pow(Convert.ToDouble(strI[1]), 2.0) + Math.Pow(Convert.ToDouble(strI[2]), 3.0) + Math.Pow(Convert.ToDouble(strI[3]), 4.0);
                break;
            case 5:
                Console.WriteLine("...");
                break;
            case 6:
                Console.WriteLine("...");
                break;
            case 7:
                Console.WriteLine("...");
                break;
            default:
                break;
        }

        //Prints out all the desarium numbers below string number
        if (calculation == Convert.ToDouble(I))
        {
            Console.WriteLine(I + " is a disarium number.");
        }
    }

    //Keeps the command line from closing
    Console.ReadLine();
    Console.WriteLine("Press ENTER to close the program.");
}

Если это не достаточно ясно.Я в основном делаю новую переменную со значением i из цикла for, но в виде строки (я делаю это, чтобы пройти через цифру за символом)

strI = Convert.ToString(I);

Затем я определяю количество цифрчисло ввода имеет с помощью оператора switch.

После этого я делаю переменную, которая является 1-м символом i-й дроби 1, 2-м символом i-й дроби 2 ... до тех пор, пока она не достигнет количества цифр.

Math.Pow(Convert.ToDouble(strI[0]), 1.0) + Math.Pow(Convert.ToDouble(strI[1]), 2.0)...

и, наконец, я сравниваю i с результатом вычисления

if (calculation == Convert.ToDouble(I))

Если переменные совпадают, это число с дисарием.

Заранее спасибо!

~ Эммануил

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Окончательный рабочий код:

//prints out all the disarium numbers lower than a user defined number
static void Main(string[] args)
{
    //assigns the variables
    string number , strI;
    double calculation;

    //asks the user for string number
    Console.WriteLine("Give a number between 10 and 1.000.000. This program will tell you all the disarium numbers lower than the given number.");
    number = Console.ReadLine();
    Console.WriteLine("");

    //calcules all the disarium numbers lower than string number
    for (Int64 I = 10;I < Convert.ToInt64(number);I++)
    {
        calculation = 0;
        strI = Convert.ToString(I);
        for (int i = 0; i < strI.Length; i++)
        {
            calculation += Math.Pow(Convert.ToDouble(strI[i].ToString()), Convert.ToDouble(i) + 1.0);
        }

        //Prints out all the desarium numbers below string number
        if (Convert.ToInt64(calculation) == I)
        {
            Console.WriteLine(I + " is a disarium number.");
        }
    }
}
0 голосов
/ 26 ноября 2018
Convert.ToDouble(strI[0].ToString())

Это исправит ваши расчеты, чтобы они не генерировали исключения.Выполнение сравнения с плавающей точкой в ​​конце потенциально проблематично, хотя из-за того, как плавающие точки хранятся с округлением.Я бы рекомендовал вам приводить каждый результат Math.Pow обратно к int / задолго до их добавления.Если int / long недостаточно велик, вам может понадобиться что-то вроде BigInteger (пространство имен System.Numerics).

Кроме того, этот оператор switch может быть заменен чем-то вроде ...

strI = Convert.ToString(I);
calculation = 0;
for(int i = 0; i < strI.Length; i++)
{
    calculation += Math.Pow(Convert.ToDouble(strI[i].ToString()));
}
if (calculation == Convert.ToDouble(I))
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...