为啥相同的代码相同的编译器在不同电脑上的运行结果不同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥相同的代码相同的编译器在不同电脑上的运行结果不同?相关的知识,希望对你有一定的参考价值。
楼主忽略了 调用函数f1 时,c 没有赋初值就直接判断
在楼主程序的基础上略作修改
截图
win linux 两个平台 都测试过
为啥两个不同的编译器给出两个不同的结果?
【中文标题】为啥两个不同的编译器给出两个不同的结果?【英文标题】:why two different compilers are giving two different results?为什么两个不同的编译器给出两个不同的结果? 【发布时间】:2021-01-12 06:15:24 【问题描述】:问题是找到数字 (1358)^n 的最后一位。我在 c++ 中使用了相同的方法和两个不同的编译器,但在 codeforces 上的两个编译器中的结果都不同。
编译器:clang c++17 诊断(代码已接受)但 GNU G++17 的判断是错误的_answer。
我不知道问题出在哪里,为什么两个编译器的结果不同?
n = [0, 1000000000]
测试用例:1000000000、32、33、36
正确答案:6、6、8、6
但使用 GNU 编译器:1、1、8、6
#include<bits/stdc++.h>
using namespace std;
int main()
ios_base::sync_with_stdio(false);
cin.tie(NULL);
double n; cin >> n;
vector<long long> res 1, 8, 4, 2, 6 ;
if (n <= 4)
cout << res[n] << "\n";
else
while (n > 4)
double x = log10(n)/log10(2);
n = (ceil(x) == floor(x))? 4 : n - pow(2, floor(x));
cout << res[n] << "\n";
return 0;
【问题讨论】:
在您的问题中,您编写了 4 个测试输入(1000000000、32、33、36),但只有 3 个输出(预期为 6、6、8,实际上得到了 1、1、8)。还请添加平台(CPU 架构)和编译选项以帮助人们找到答案。 您的 while 循环是否应该类似于n = n%4; if (n==0) n =4;
?我想您的代码由于浮点舍入错误而失败
@HeroWanders 感谢您指出这一点!我现在已经更新了结果。
【参考方案1】:
我can't reproduce your problem,但这可能是由于浮点舍入错误(请参阅Is floating point math broken?)。
没有必要使用浮点数来解决这个问题。您似乎已经意识到最后一位数字遵循 8、4、2、6 的重复模式。要查找您正在使用该模式的哪个元素,您只需使用 n % 4
:
#include <iostream>
#include <vector>
#include <cmath>
int main()
for (int n : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32, 33, 36, 1000000000)
std::vector<int> res 1, 8, 4, 2, 6 ;
n = (n - 1) % 4 + 1;
std::cout << res[n] << "\n";
return 0;
【讨论】:
以上是关于为啥相同的代码相同的编译器在不同电脑上的运行结果不同?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Arduino IDE 中的相同代码在不同的笔记本电脑上给出不同的输出?
求助:为啥我编的C++程序在自己电脑上能正常运行,但编译后挂在后台linux系统下就总是运行一半后出错,