[解決済み] なぜか出る。-9223372036854775808
2022-02-01 04:01:12
質問
#include <iostream>
#include <sstream>
#include <numeric>
#include <math.h>
using namespace std;
int64_t splitAdd(int64_t value) {
ostringstream intStream;
intStream << value;
string intString(intStream.str());
return accumulate(intString.begin(), intString.end(), 0) - (intString.size() * int64_t('0'));
}
int main(int argc, char *argv[]) {
int64_t maxPower = 50;
int64_t results[maxPower];
for (int64_t tuple = 0; tuple <= maxPower; tuple++) {
for(int64_t power = 0; power <= maxPower; power++) {
int64_t value = pow(tuple, power);
while (value > 9) {
value = splitAdd(value);
}
results[power] = value;
}
cout << tuple << endl;
for (int i = 0; i < maxPower; i++) {
cout << results[i] << ',';
}
cout << endl;
}
}
しばらくすると、「-9223372036854775808」という値が繰り返し表示されます。私はこれをコードランナー2でも実行していますが、それが違いを生むかどうかはわかりません。
解決方法は?
目に余るエラーはこれだ。
int64_t maxPower = 50;
int64_t results[maxPower]; // <-- Not really legal, but let's pretend
//...
for (int64_t power = 0;
power <= maxPower; // <-- Look at the loop constraints
power++)
{
//....
}
results[power] = value; // <-- Buffer overrun
以降
maxPower
が50であれば、境界外の要素にアクセスしていることになります。 これは
未定義の動作
また、コードを合法的なC++にするために、50の配列を宣言するか。
int64_t results[50];
を宣言するか
std::vector<int64_t>
.
そうして
at()
の代わりに
[]
そうすれば、プログラムがどのように壊れるか、よりよくわかるようになります。 参照
std::vectorを使用したライブサンプルはこちら
.
奇数(quot;odd number")の件ですが、ここで数値のオーバーフローが発生しています。
int64_t value = pow(tuple, power);
もし
tuple
が3であり、かつ
power
は
41
をオーバーフローしている場合、その値は
int64_t
の型があります。
もしかしたら 任意精度ライブラリ (できれば必要な数学演算子がオーバーロードされているもの)、あるいは自分で書いて、quot;regular" C++の型を使う代わりにします。 そうすれば、オーバーフローは起こらないし、起こすべきではないでしょう。
関連
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】デバッグアサーションに失敗しました