如何在c或c++中轻松解决这个问题
How to solve this easy in c or c++?
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及其模数的情况下进行计算。读取大数的模幂
- Project Euler问题4的错误解决方案
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 错误LNK2005无法解决问题的解决方案
- 如何解决g++问题"internal compiler error: Illegal instruction min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MI
- 必须使用尾随返回类型的示例,因为无法用旧方法解决问题
- 如何解决问题"unresolved extenal symbol _DllMainCRTStartup@12"?
- 如何使用OlesetClipboard将我的COM对象放置在剪贴板上时解决问题
- 与C++析构函数相比,C#析构函数和GC并没有真正解决问题
- 没有调用函数,而是使用垃圾值.如何调用函数并解决问题
- 所有的组合算法和解决C++问题的一般方法
- 模板过载解决问题
- 对"pthread_key_create"的未定义引用;参数顺序不能解决问题
- 如何在使用cplex解决问题时设置间隙
- 选择一门语言学习真的很重要吗?他们都使用相似的技术来解决问题
- Iostream解决c++问题
- 递归是一件坏事吗?在递归似乎最有用的地方,是否有更清晰或更有效的方法来解决问题?