C++中1e9(初始化、无穷大)解析

对新手友好,简单易于理解
前言:
C++初学者遇到1e9时,可能会很好奇,这个表示什么意思?有什么用?遇到的一些问题为什么要这么处理?以下是个人的一些理解。

1.什么是1e9
通常来说这是计算机中一种科学计数法的表示形式:
1e9 = 110^9 = 1000000000;
例如:9e8 = 9
10^8 = 900000000;
e表示10,e后面的数字表示次方,e的多少次方。

2.C++中的1e9

int num1 = 1e9;
int num1 = 1e10;
输出的结果为:
num1 = 1 000 000 000;
num2 = 1 410 065 408

那么问题来了,为什么num2 不等于 10000000000 ?
C/C++中int类型是32位的,范围是-2147483648 到 2147483647。
int占用4个字节,也就是32位,除了第一位代表符号,剩下的31位可用。
十进制的 1e10时,转换为二进制:
10 0101 0100 0000 1011 1110 0100 0000 0000前两位出现数据溢出问题。
而0101 0100 0000 1011 1110 0100 0000 0000 转换成十进制就是 1 410 065 408

3.C++中某个变量初始化赋值为1e9

int count = 1e9;
res = min(res, count);

实际中遇到的一些问题,或者解决一些算法问题时,会遇到给某个变量初始化并赋值为1e9。接着后面会出现一些代码计算最小值。
这时,1e9的作用是给变量赋一个初始极大值,原因在于后面的代码中需要取此变量和其他变量的最小值。初始化为一个最大值,亦即初始化为无穷,便于后面极小值的比较和获取,属于初始化的目的。
有时我们需要比较大小,或者在matlab等其语言中为取无穷,我们只需取一个很大的值即可。C++中取1e9,10的九次方就是一种方法,代表一个很大的值。

4.C++中表示正无穷与负无穷
正无穷:0x3f3f3f3f
负无穷:0xc0c0c0c0

    int a=0x3f3f3f3f;
    int b=0xc0c0c0c0;
    输出:
    a=1061109567
    b=-1061109568

5.mod 1e9+7
在一些算法题目中,会遇到这样的情况:
由于结果可能较大,将结果mod 1e9+7,即mod 1000000007 。
或者( a * b ) % c = [ ( a % c ) * ( b % c ) ] % c 而这个c最常见的还是1e9+7。
有时候结果比较大的时候,会对结果进行mod 1e9+7操作。为什么呢?
第一:
1e9+7是一个很大的数,int32位的最大值为2147483647,所以对于int32位来说1000000007足够大。int64位的最大值为2^63-1,对于1000000007来说它的平方不会在int64中溢出所以在大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出 。有点于归一化的意思。
当一个问题只对答案的正确性有要求,而不在乎答案的数值,可能会需要将取值很大的数通过求余变小
第二:
其次,1e9+7是一个质数,在模素数p的情况下a*n(a非p的倍数)的循环节长为p,这是减少冲突的一个原因。另一方面模素数p的环是无零因子环,也就是说两个非p倍数的数相乘再模p不会是零(如果是0的话,在多个数连乘的情况下会大大增加冲突概率)。比如说如果所有的结果都是偶数…你模6就只可能出现0, 2, 4这三种情况…但模5还是可以出现2, 4, 1, 3这四(4=5-1)种情况的… hash表如果是用取模的方法也要模一个大质数来减少冲突,出题人也会这样来 希望减少你“蒙对“的概率。

如果这篇文章对你有用的话,请点击下方的一键三连,感谢感谢!

  • 109
    点赞
  • 228
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用C++实现Dijkstra算法的示例代码: ```c++ #include <iostream> #include <vector> #include <queue> using namespace std; const int INF = 1e9; // 无穷大 const int MAXN = 1000; // 最大点数 vector<pair<int, int>> adj[MAXN]; // 邻接表存图 int dist[MAXN]; // 起点到各点的最短距离 bool visited[MAXN]; // 标记是否访问过 void dijkstra(int s) // s为起点 { fill(dist, dist + MAXN, INF); // 初始化dist数组为无穷大 fill(visited, visited + MAXN, false); // 初始化visited数组为false dist[s] = 0; // 起点到自身的距离为0 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.push(make_pair(dist[s], s)); // 将起点加入优先队列 while (!pq.empty()) { int u = pq.top().second; pq.pop(); if (visited[u]) // 若u已被访问过,则跳过 continue; visited[u] = true; // 标记u已被访问过 for (auto v : adj[u]) { int w = v.first; int weight = v.second; if (dist[u] + weight < dist[w]) // 更新距离 { dist[w] = dist[u] + weight; pq.push(make_pair(dist[w], w)); // 将w加入优先队列 } } } } int main() { int n, m; // n为点数,m为边数 cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, weight; cin >> u >> v >> weight; adj[u].push_back(make_pair(v, weight)); adj[v].push_back(make_pair(u, weight)); // 无向图,因此加入两条边 } int s; // 起点 cin >> s; dijkstra(s); for (int i = 0; i < n; i++) cout << "起点" << s << "到点" << i << "的最短距离为:" << dist[i] << endl; return 0; } ``` 代码使用了邻接表存图,使用了STL的优先队列来维护距离最小值,时间复杂度为$O(mlogn)$,其n为点数,m为边数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值