Обработка "больших" целых чисел в C # - PullRequest
6 голосов
/ 06 июня 2009

Как мне обрабатывать большие целые числа в C #?

У меня есть функция, которая даст мне произведение делителей:

private static int GetDivisorProduct(int N, int product)
    {
        for (int i = 1; i < N; i++)
        {
            if (N % i == 0)
            {
                Console.WriteLine(i.ToString());
                product *= i;
            }
        }

        return product;
    }

Функция вызова GetDivisorProduct(N, 1)

Если результат больше 4 цифр, я должен получить только последние 4 цифры. (Например, если я введу 957, выходной будет 7493 после обрезки только последних четырех значений. Фактический результат - 876467493.).

Другие примеры входных данных: если я даю 10000, выходной сигнал равен 0.

Класс BigInteger удален из библиотеки C #!

Как я могу получить последние четыре цифры?

Ответы [ 7 ]

27 голосов
/ 06 июня 2009

Если вы смотрите только на последние четыре цифры, вам не нужно ничего больше, чем целое число. Учтите это:

Если при умножении двух чисел вас интересуют только младшие значащие цифры (то есть последние четыре цифры), то самые верхние цифры не будут влиять на младшие цифры результата. .. так что вы можете просто " выбросить " наиболее значимых (правых) цифр перед тем, как умножить .

Например: я хочу умножить два больших числа, но мне нужны только последние две цифры:

int num1 = 123456789;
int num2 = 987654321;

int result = num1 * num2; // Last two digits would be "69" but this OVERFLOWS

но если мы умножим только последние две цифры ...

int result = (num1 % 100) * (num2 % 100);  // result = 89 * 21

89 * 21 = 1869 (последние две цифры по-прежнему " 69 ", но мы не переполнились ).

Я использовал эту технику , чтобы вычислить Шесть крайних правых цифр 1 000 000 факториала .

Наслаждайтесь

Роберт К. Картейно

7 голосов
/ 06 июня 2009

.NET 4.0 имеет BigInteger класс

1 голос
/ 06 июня 2009

Ну, вы можете изменить свой код следующим образом:

    for (int i = 1; i < N; i++)
    {
        if (N % i == 0)
        {
            Console.WriteLine(i.ToString());
            product *= i;
        }
        if (product > 10000 * N)
        {
            product %= 10000;
        }
    }

Это потому, что последние четыре цифры (10000 * k + l) R такие же, как для l R. Фактический тип продукта зависит от диапазона N, которые вы хотите обработать. Если это все целочисленный тип, тогда product должен быть длинным.

Кстати, почему вы передаете продукт в качестве параметра, если он всегда равен 1?

1 голос
/ 06 июня 2009
0 голосов
/ 06 июня 2009

Если вы не можете перейти на .NET 4.0 прямо сейчас, вы можете использовать BigInteger из библиотеки J # из C #. Вот статья, описывающая как . Это влияет на развертывание, так как вам нужно развернуть J # распространяемый .

0 голосов
/ 06 июня 2009

Надеюсь, я не правильно понял, но вы хотите написать в консоли "0000", если результат равен 0? Вы пробовали:

Console.WriteLine(i.ToString().PadLeft(4,"0")); 

Если вам нужно получить число 0000 как int, извините, но я не знаю, как его получить.

0 голосов
/ 06 июня 2009

Как насчет попытки использовать double или long вместо int для продукта? Это будет работать только в некоторых случаях, но позволит вам работать с большими числами, которые вы смогли.

...