一、为什么会溢出?
整数乘积的溢出问题是指两个整数相乘得到的结果超过了所能表示的数据类型的范围。
在计算机中,整数的表示是有限的,即存在一个最大值和最小值。当进行乘法运算时,如果结果超出了整数的表示范围,就会发生溢出。这种情况下,计算结果将不再准确,并且可能导致数据丢失或错误的计算结果。
比如:int类型,C 语言标准规定了 int 类型必须至少能表示 -32767 到 32767 之间的整数,也就是说,int 类型的最小值和最大值范围为 -215 到 215-1。
一般而言,int 类型在 32 位操作系统上占用 4 个字节(32 位),在 位操作系统上占用 8 个字节( 位)。使用 limits.h 头文件可以查看当前编译器中 int 类型的最大值和最小值。
#include<iostream>
#include <limits.h>
using namespace std;
int main()
{
printf("INT_MIN: %d\n", INT_MIN);
printf("INT_MAX: %d\n", INT_MAX);
system("pause");
return 0;
}
二、怎样解决?
可以使用更大范围的整数类型,比如 long long 或者 int_t 等,以支持更大范围的数值计算。
根据取值范围,灵活选用整数类型:
三、看个例题
求 a 的 b 次方对 p 取模的值,其中 0≤a,b,c≤109, c>0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c;
int main(){
cin >> a >> b >> c;
ll ans = 1;
while (b) {
if(b&1) {
ans = ans * a % c;
}
a = a * a % c;
b /= 2; // 将指数右移一位
}
cout << ans % c << endl;
return 0;
}
这里用long long类型来表示a,b,c三个数,防止整数溢出,同时用到了快速幂算法,防止两整数相乘的结果发生整数溢出。
快速幂算法通过对指数 y 进行二进制拆分,将指数的幂运算转化为多个底数的平方运算,从而减少了计算次数,提高了算法效率。
-
在 C 和 C++ 中,y & 1 表示对变量 y 的值和二进制数 1 进行按位与(AND)操作。具体来说,这个表达式会将 y 的二进制表示的最低位与 1 进行按位与运算,得到的结果为 0 或 1。
-
如果 y 的最低位是 1,那么 y & 1 的结果就是 1;如果 y 的最低位是 0,那么 y & 1 的结果就是 0。
-
这种操作通常用于判断一个整数是奇数还是偶数。因为二进制数的最低位为 1 表示奇数,为 0 表示偶数,所以 y & 1 可以快速判断 y 是奇数还是偶数。
#include<stdio.h>
int main(){
long long a,b,c,d=1;
scanf("%ld %ld %ld",&a,&b,&c);
while(b){
if(b&1) d=d*a%c;
a=a*a%c;
b>>=1;
}
printf("%ld",d%c);
}
a, b, c = map(int, input().split())
print(pow(a, b, c))
但是如果python以下写法,数值很大的时候就会发生溢出。
a, b, c = map(int, input().split())
ans = pow(a, b) % c
print(ans)
虽然Python 中的整数类型是动态的,不会存在固定的最大值,但如果结果超出了 Python 能表示的范围,也会发生溢出。就比如pow(a, b) % c这一步,当a, b, c 很大的时候,也是会发生整数溢出。
但是python有个很方便的函数,就是pow()的用法
pow(a, b, c)
具体参数含义如下:
a:底数
b:指数
c:模数
这个函数返回值为 (a**b) % c 的结果。
例如,pow(2, 3, 5) 将返回 3,因为 2 的 3 次方是 8,然后对 5 取模的结果是 3。
pow(a, b, c)函数在需要进行大数运算并对结果取模的情况下非常有用。
四、补充:scanf和cin的区别
scanf() 是 C 语言中的输入函数,而 cin 是 C++ 中的输入流对象。它们之间有以下几个区别:
总的来说,scanf() 是 C 语言中的函数,使用格式化字符串来指定输入格式,而 cin 是 C++ 中的输入流对象,使用运算符重载和类型推断来直接从标准输入流中读取数据,并提供更灵活的错误处理机制。两者在输入方式、错误处理、缓冲处理和输入分隔符上有所不同。
ps:如若文章有误,感谢指正!(づ ̄3 ̄)づ╭❤~