Как решить это легко в C или C ++?

0
print 10**1000 % 7

В CI получить синтаксическую ошибку, потому что она превышает ограничение памяти, я думаю. Могу ли я как-то решить это легко на C или C++, чтобы он дал мне по модулю 10 к мощности 1000?

  • 0
    Ты long пробовал?
  • 0
    10 умноженное на 1000 разыменовывается?
Показать ещё 6 комментариев
Теги:

6 ответов

5
Лучший ответ

В дополнение к тому, что не является синтаксисом в C/C++, это плохой практикой в python.

Если вы это сделаете

pow(10,1000,7)

Он будет использовать модульное возведение в степень, поэтому он будет намного быстрее, чем делать

10 ** 1000 % 7
  • 0
    Из какой библиотеки вы получаете этот pow ?
  • 0
    @juanchopanza Pow - встроенный
Показать ещё 3 комментария
3

вы можете использовать pow для питания. здесь размер результата - большое значение, поэтому вам нужно разделить проблему на меньшую часть и решить меньшие, чтобы получить решение в c, или вам нужно будет обрабатывать большие числа.
вы можете применять правила модуля, чтобы уменьшить проблему, поскольку,

10^1000 % 7 =((10%7)^1000)%7
10^1000 % 7 =(((((10^10)%7)^10)%7)^10)%7

объединить эти правила и использовать, чтобы уменьшить числа, сгенерированные шагами (mod 10). Использовать встроенную функцию pow() в c, чтобы получить мощность числа как X ^ y = pow (x, y)

  • 0
    Правило, которое вы используете "a ^ b (mod p) = a ^ (b mod p) (mod p)", действует только в том случае, если a и p взаимно просты. Контрпример - 2 ^ 10 (мод 8)! = 2 ^ 2 (мод 8)
  • 0
    @MattMcNabb хорошо. Благодарю. но указанное мной правило выглядит как 2 ^ 10 (мод 8) = (2 ^ 2 (мод 8)) ^ 5 (мод 8).
2

Самый общий способ решения этих типов задач с большими целыми числами в небольших (например, 32-разрядных) регистрах - это возведение в степень возведения в квадрат и принятие по модулю на каждом шаге. Например, 10 ^ 10 по-прежнему слишком велика, чтобы вписаться в 32-битный int, хотя в наши дни вы, вероятно, просто используете длинный.

1

Самый простой способ сделать это - уменьшить члены по модулю. Общая формула

a b mod c ≡ (mod c) (b mod φ (c)) mod c

Поэтому в этом случае вы получаете

10 1000 mod 7 = (10 mod 7) (1000 mod φ (7)) mod 7.

10 mod 7 = 3

φ (7) = 6

1000 mod 6 = 4

3 4= 81

81 mod 7 = 4

поэтому 10 1000 mod 7 = 4

1

В C (и C++ слишком AFAIK) это недействительный синтаксис. Вы можете использовать функцию pow для возведения в степень. Но имейте в виду, что возвращаемое значение pow double а оператор modulo работает для int. Вам нужны предостережения.

long result = (long)pow(10, 1000);
result = result % 7;
  • 1
    Флоат Пау с последующей операцией по модулю не даст никакого значимого результата. Та же проблема с использованием, например, Паскаля Math.Pow.
  • 0
    @MarcovandeVoort; Эй, ваша точка зрения действительна! Добавление к ответу.
Показать ещё 2 комментария
0
  • в C и C++ нет оператора **, вы должны использовать функцию pow, которая, однако, работает только для типов с плавающей точкой; и оператор% работает только для интегральных типов, для типов FP вам нужно использовать fmod;
  • во всяком случае, если вы вставляете какую-то константу 10 ** n, вы просто пишете 1En (скажем, 1E42);
  • ... но нет стандартного типа, способного удерживать число до 1E1000; даже если некоторый тип FP смог удержать его, вы не могли бы надежно использовать fmod на нем из-за конечной точности мантиссы.

Итак, как это работает Python? Под капотом, за пределами "обычных" типов, используется библиотека произвольной точности. Вы можете сделать то же самое в своей C++ программе, предоставляя такую библиотеку (например, вы можете использовать GMP).

Но: выражение, которое вы предоставляете, может быть рассчитано без фактического вычисления 10 ** 1000 и его модуля. Чтение мощности модуля больших чисел

Ещё вопросы

Сообщество Overcoder
Наверх
Меню