私は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
(GCCと私の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
私はそれがアーキテクチャやコンパイラとは関係ないと思います。数値が0より大きいかどうかをテストするときは、完全条件を使用します。私。 'if(num> 0)'ではなく 'if(num> 0)'を使います。これが問題であるかどうかわからない – smac89
*異なるコンパイラで未定義の動作を引き起こす記述はありません* - しかし、浮動小数点値を生成する文( 'pow()')があります。同じ結果が得られることが保証されています。 – PaulMcKenzie