如何在c或c++中轻松解决这个问题

How to solve this easy in c or c++?

本文关键字:解决 问题 c++      更新时间:2023-10-16
print 10**1000 % 7

在C中,我得到一个语法错误,因为它超过了内存限制,我猜。我能不能用C或c++简单地解决这个问题,使它能给我一个10的1000次方的模?

这不仅在C/c++中是无效的语法,在python中也是不好的做法。

如果你这样做

pow(10,1000,7)

它将使用模求幂所以它将比

快得多
10 ** 1000 % 7

可以使用pow进行电源操作。在这里,结果的大小是很大的值,所以你需要把问题分成更小的部分,解决更小的部分,以得到c的解决方案,否则你将需要处理大的数字。
您可以应用模规则来减少问题,

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

将这些规则组合起来,并使用(mod 10)来减少步骤中生成的数字。使用c中内置的pow()函数得到数的幂为X^y=pow(X,y)

在小寄存器(例如32位)中解决这些类型的大整数问题的最一般方法是通过平方取幂,并在每一步取模。例如,10^10对于32位int来说仍然太大了,尽管现在你可能只需要使用long。

在C(当然也包括c++)中,这不是一个有效的语法。可以用pow函数求幂。但请记住,pow的返回值是double,模运算符适用于int。你需要一些注意事项。

long result = (long)pow(10, 1000);
result = result % 7;

最简单的方法是通过模数减少项。一般公式为

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

在这里你得到

10 <一口> 1000 共舞,国防部7 =(10国防部7)<一口>(1000国防部φ;(7))共舞,国防部7 .

10 mod 7 = 3

φ(7) = 6

1000 mod 6 = 4

34 = 81

81 mod 7 = 4

so 101000 mod 7 = 4

  • 在C和c++中没有**操作符,你必须使用pow函数,但它只适用于浮点类型;%操作符只适用于整型,对于FP类型,你必须使用fmod;
  • 无论如何,如果你插入了一个常数10**n,你只需要写1En(比如,1E42);
  • …但没有标准类型可以容纳1E1000这么大的数字;即使某些FP类型能够保存它,由于尾数的有限精度,您也不能可靠地在其上使用fmod

那么,Python是怎么做的呢?在底层,在"正常"类型范围之外,它使用任意精度库。您可以在您的c++程序中做同样的事情,提供这样的库(例如您可以使用GMP)。

但是 :您提供的表达式可以在不实际计算10**1000及其模数的情况下进行计算。读取大数的模幂