计算一个数字的大幂
Calculating large power of a number
#include<iostream>
#include<cstdio>
#define M 1000000007
using namespace std;
long long int power(int a,int b)
{
if(b==0)
return 1;
else if(b==1)
return a;
else if(b%2==0)
return power((a*a)%M,b/2);
else
return (power((a*a)%M,b/2)*a)%M;
}
在这个函数中,当我传递 a=2、b>31 时,它总是返回 0.对于 b=31,我得到了 147483634.你能说出问题出在哪里吗?
或者你能说出另一种计算数字大幂的方法吗?
在(a*a)%M
中,a*a 可能在计算余数之前溢出。从 2 开始,产生 0 的溢出并不让我感到惊讶。您需要使用能够表示 (M-1(*(M-1( 的类型,即1000000012000000036而int
通常仅限于 2147483647。 long long
(自 99 年以来在 C 中是标准的,自 11 年以来在 C 中是C++标准的,其他地方是通用扩展(保证工作。
在<cmath>
下,有pow(x,y)
其中 x 是基数,y 是指数。 x^y.
参考这里
当a
是int
时,a*a
使用int
大小的算术。 尝试a*(long long)a
,使用不会溢出的更广泛的算术。
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何获取一个数字的前3位
- 我想做一个彼此不同但重复出现的数字
- 如何检查一个c++字符串中有多少相同的字符/数字
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- CIN 仅在输入非数字值时跳过下一个 CIN
- 以C++输出一个数字三角形
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 一个C++程序,用于在输入位数时输出具有特定位数的 .txt 文件中的所有数字
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 找到 x^n 的所有组合,并检查它们的总和是否等于一个不包括相同数字的数字
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 将数字提高到一个巨大的指数
- 反转一个数字程序不起作用,为什么?
- 使用带有一个参数函数的递归找到数字的平方
- 为什么当我输入一个大数字时,输出会一遍又一遍地重复?
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作