我在Codeforces上解決了Quasi-Binary問題(無所謂),這是我的submission。這是我產生的代碼:在不同編譯器上產生不同輸出的代碼
#include <iostream>
#include <cmath>
using namespace std;
int quasi_binary(int num, int tens)
{
int res,digit;
if(num == 0)
{
return 0;
}
digit = num%10;
num = num/10;
res = quasi_binary(num, tens+1);
if(digit)
{
cout << 1;
return ((digit-1)*pow(10,tens)+res);
}
else
{
cout << 0;
return res;
}
}
int main()
{
int n,k=-1,temp,digit;
cin >> n;
//this loop calculates the value of k,as it needs to be printed first
temp=n;
while(temp)
{
digit = temp%10;
temp = temp/10;
if(digit>k)
k=digit;
}
cout << k << endl;
//print those k quasi-numbers
while(n)
{
n = quasi_binary(n,0);
cout << " ";
}
return 0;
}
我沒有看到任何可能在不同編譯器上產生未定義行爲的語句。我在適當的地方使用了適當的括號,以避免模棱兩可。仍然存在未定義的行爲。任何人都可以請幫忙找到生成未定義行爲的語句/指令。
輸入
415
輸出(在線評測) - 不正確
5
111 101 101 11 11 11 11 11 11 11 11 11
輸出(我的64位PC與海灣合作委員會上) - 正確
5
111 101 101 101 1
'POW(10,十位)' - 如果你有整數指數不要使用'pow'。 [不保證pow會給你正確的結果](http://stackoverflow.com/questions/25678481/why-pown-2-return-24-when-n-5/25678721#25678721)。 – PaulMcKenzie
我不認爲它與架構或編譯器有關。測試數字是否大於零時,請使用完整的條件。即使用'if(num> 0)'而不是'if(num)'。不確定這是否是問題 – smac89
*我沒有看到任何可以在不同編譯器上產生未定義行爲的語句* - 但是您確實有產生浮點值的語句('pow()'),因此您的程序不是保證產生相同的結果。 – PaulMcKenzie