文章目录

1.科学计数法本质为浮点型2.科学计数法不建议直接参与大整数之间运算

1.科学计数法本质为浮点型

#include

using namespace std;

typedef long long LL;

int main(){

double y = 1e-2;

cout << y << endl;// 0.01

}

2.科学计数法不建议直接参与大整数之间运算

 科学计数法本质是浮点数:如果直接用科学计数法进行小整数之间运算,大多数时候浮点数的精度也足够保证可以不出错,但是如果使用科学计数法进行大整数,尤其是较大范围整数如1e16这种,带上了一串小的整数的时候如1这个样子,可能会直接导致其赋值出现错误

#include

using namespace std;

typedef long long LL;

int main(){

LL s = 1e16 + 1; // 1e16导致精度损失

cout << s << endl;

}

 建议科学计数法不要直接参与大整数之间的运算,尤其是在某些题目需要大整数的时候,例如对于哈希函数,运算的时候不要直接让(1e9 + 1)直接参与运算,会导致精度的损失,尤其是在进行参与乘法运算的时候可能会造成精度损失

LL get_hash(int x, int y){ // 不要这个样子去写 !!!

return 1ll * (1e9 + 1) * x + y;

}

LL get_hash(int x, int y){ // 直接写明其大小 !!!

return 1ll * 1000000001* x + y;

}

 例如:蓝桥杯2022年——扫雷(可以试试直接参与运算,会Wrong Answer)  题目连接:扫雷

#include

#include

#include

#include

#include

using namespace std;

typedef long long LL;

const int N = 5e4 + 10, M = 999997;

LL h[M];

int id[M]; // 存放炸雷id

bool st[M]; // 该位置受否被访问

struct{

int x, y, r;

}bmb[N];

int sqrt(int x){

return x * x;

}

/*

LL get_hash(int x, int y){ // 不要这个样子去写 !!!

return 1ll * (1e9 + 1) * x + y;

}

*/

LL get_hash(int x, int y){

return 1ll * 1000000001 * x + y;

}

int get_key(int x, int y){

LL hash = get_hash(x, y);

int key = (hash % M + M) % M;

while(h[key] != -1 && h[key] != hash){

if(++ key == M) key = 0;

}

return key;

}

void dfs(int x, int y, int r){

int key = get_key(x, y);

st[key] = true;

for(int i = x - r; i <= x + r; i ++ )

for(int j = y - r; j <= y + r; j ++ )

if(sqrt(x - i) + sqrt(y - j) <= r * r){

int key = get_key(i, j);

if(id[key] != -1 && st[key] == false) dfs(i, j, bmb[id[key]].r);

}

}

int main(){

memset(h, -1, sizeof(h));

memset(id, -1, sizeof(id));

int n, m;

scanf("%d%d", &n, &m);

for(int i = 0; i < n; i ++ ){

int x, y, r;

scanf("%d%d%d", &x, &y, &r);

bmb[i] = {x, y, r};

LL hash = get_hash(x, y);

int key = get_key(x, y);

h[key] = hash;

if(id[key] == -1 || bmb[id[key]].r < r) id[key] = i;

}

for(int k = 0; k < m ; k ++ ){

int x, y, r;

scanf("%d%d%d",&x, &y, &r);

for(int i = x - r; i <= x + r; i ++ )

for(int j = y - r; j <= y + r; j ++ )

if(sqrt(x - i) + sqrt(y - j) <= r * r){

int key = get_key(i, j);

if(id[key] != -1 && st[key] == false) dfs(i, j, bmb[id[key]].r);

}

}

int ret = 0;

for(int i = 0; i < n; i ++ ){

int key = get_key(bmb[i].x, bmb[i].y);

if(st[key]) ret ++;

}

cout << ret;

return 0;

}

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。