🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

5回答

1729閲覧

学校の課題です。c++ でコードをお願いします。

KaiIrwin

総合スコア4

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/10/12 08:22

前提・実現したいこと

課題は、
任意の整数 n に対し、コラッツ予想を確認してみよ

nが偶数のとき2で割る
nが奇数のとき3倍し,1を足す。

以上の操作を繰り返せば、1に到達する

発生している問題・エラーメッセージ

おそらく while を使うと思いますが、コードが書けアセン

該当のソースコード

c++

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

課題なら自分でするもんでしょうに。

それにコード制作依頼は受け付けておりません

投稿2019/10/12 08:25

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1になるまで何回処理が行われるかを表示します。

C++

1#include <functional> 2#include <iostream> 3 4int main() 5{ 6 std::function<int(int)> f = [&f](auto n) { 7 if (n == 1) return 0; 8 return f(n % 2 ? 3 * n + 1 : n / 2) + 1; 9 }; 10 11 int i = 1; 12 std::cin >> i; 13 std::cout << f(i) << std::endl; 14 return 0; 15}

【Q&A】

Q: 課題に対してすぐにコードを与えるのは良くないという人がいます。どう思いますか?
A: ある質問の私の回答を参考にしてください。

Q: このコードはなんですか?
A: とある質問をしたときに、コラッツの計算で1になるまでをカウントするコードをたくさん書いたのでそのときのコードを引っ張ってきて、ちょっと書き換えました。

Q: 三項演算子は悪であるとか言ってませんでしたか?
A: 人は時と場合で意見が変わるものです。

Q: 偶数・奇数を調べるときは!(n % 2)n % 2を条件式に入れるのではなくn % 2 == 0n % 2 != 0等と書くべきであるとどこかで書いてませんでしたか?
A: ひ、人は時と場合で意見が変わるものです。

Q: 課題が「任意の整数」となっている場合、あなたはいつも「intじゃ小さすぎるので多倍長整数使え」とか言ってませんでしたか?
A: ひ、ひと、人は時と場合で意見が変わるものですぅ。

Q: でも、零や負の数ぐらいはチェックしないのですか?
A: そもそもコラッツの予想は「任意の正の整数」に対してなのに、「任意の整数」と言っている課題がおかしいから、そこは大目に見てください。

Q: これって与えられた数値が大きすぎるとスタックオーバーフローしませんか?
A: 最適化オプションを付け忘れていなければしないはずです。綺麗な末尾再帰だし。逆アセンブルしてまでは確認してませんけど。

Q: std::function<int(int)>は型推論できそうですが、autoにしないのですか?
A: **できません。**できない理由はこちらの回答を参考にしてください。C++17がリリースされ、C++20ももうすぐ出そうですが、named lambdaはまだ未採用なようです。

Q: もし、コラッツの予想に反例が存在した場合、無限ループになりませんか?
A: Wikipediaによると5*2^60までは予想が成り立つことがわかっています。現在主流の環境のほとんどはintが32bitなので、このコードではそんな大きな数は計算できないから、無限ループになることはありません(ただしintのオーバーフローで負の値に突入し、無限ループに陥ることはあり得る)。ただ、反例が存在することを前提にするなら…どうするんでしょう?ここらへんは数論やっている数学者に聞いてください。私じゃわかりません。

Q: もっと高速にできないの?
A: Wikipediaによると方法はあるみたいです。

Q: もしかして、ここが本編?
A: お、やっと気付いたかい。

投稿2019/10/12 09:51

raccy

総合スコア21737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コラッツ予想を確認するのでしたら、1にならない場合とは何かを考えましょう。

投稿2019/10/12 14:58

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

課題は自分でd^^

偶数、奇数の判定は出来ますか?
・・・1になれば終わりです。

ソースをもらっても何の意味もありません、質問者が覚えようとしていないからです。
そうじゃないと言うなら、「習ったことを思い出して」頑張って下さい。

投稿2019/10/12 09:57

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コラッツ予想 "C++"
で google  検索はしてみましたか?

投稿2019/10/12 09:41

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問