質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

Q&A

解決済

3回答

1681閲覧

whileループを終えるときの条件がわからない。

alizona

総合スコア126

C++

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

0グッド

1クリップ

投稿2020/06/24 02:26

編集2020/06/24 21:21

#質問文↓と実行しているコードに差があることでエラーが起こっていると思うのですが、whileループを終える条件は、n==1の時と、どの時ですか?

###解決したコード

C++

1 2class Solution { 3public: 4 bool isHappy(int n) { 5 int remain; 6 int sum=0; 7 8 9 while(n>9){ 10 while(n){ 11 remain=n%10; 12 sum+=remain*remain; 13 n=n/10; 14 } 15 n=sum; 16 sum=0; 17 } 18 19 if(n==1) 20 return true; 21 else if(n==7) 22 return true; 23 else 24 return false; 25 } 26};

C++

1Write an algorithm to determine if a number n is "happy". 2 3A happy number is a number defined by the following process: 4Starting with any positive integer, 5replace the number by the sum of the squares of its digits, 6and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. 7 8Those numbers for which this process ends in 1 are happy numbers. 9 10Return True if n is a happy number, and False if not.

イメージ説明

###コード

C++

1class Solution { 2public: 3 bool isHappy(int n) { 4 5 bool isone=false; 6 bool ishun=false; 7 bool isten=false; 8 int one; 9 int ten; 10 int hun; 11 12 while(n!=1){ //←この条件を何にすべきかわかりません。 13 isone=false; 14 ishun=false; 15 isten=false; 16 17 if(n<10) 18 isone=true; 19 20 else if(n<100){ 21 isone=false; 22 isten=true; 23 24 }else if(n>99){ 25 isten=false; 26 ishun=true; 27 } 28 29 if(isone){ 30 one=n; 31 n=one*one; 32 33 }else if(isten){ 34 ten=n/10; 35 one=n-ten*10; 36 37 n=ten*ten+one*one; 38 }else if(ishun){ 39 hun=n/100; 40 ten=(n-hun*100)/10; 41 one=n-hun*100+ten*10; 42 43 n=hun*hun+ten*ten+one*one; //←エラーはここにあります。 44 } 45 } 46 if(n==1) 47 return true; 48 else 49 return false; 50 } 51};

###エラー

C++

1Line 66: Char 22: runtime error: signed integer overflow: 231813 * 231813 cannot be represented in type 'int' (solution.cpp) 2SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:75:22

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

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

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

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

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

yumetodo

2020/06/24 02:43

とりあえずintじゃなくてuint64_tに変えてみてはどうですかね?エラー文そのものは型の大きさが足らんって言ってるので
alizona

2020/06/24 04:16

ありがとうございます。 uint64_t ですね。初めて見ました。 使い方等理解したのですが、 私の解く問題の関数の引数の型は予めintに指定されています。 英語が読めてなくて、whle loopの条件をどうしていいかわかっていません。 そのため桁数が大きくなるまでループして、今回のエラーが起こっています。
guest

回答3

0

1以外の脱出条件は、以下↓に書いてあります。
ハッピー数を知ってハッピーに!

また、ウィキペディアには、Pythonのプログラムが出ています。

投稿2020/06/24 08:58

編集2020/06/24 09:05
cateye

総合スコア6851

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

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

cateye

2020/06/24 09:10

・・・10進1桁の2乗ですから、81(9×9)より大きくは絶対なりません。
alizona

2020/06/24 14:57

無限リピートだった時の脱出について書かれているということでしょうか?
cateye

2020/06/24 15:58 編集

引用ーー> あれ?また4にもどりましたね。 このまま続けても繰り返しになるので4は1になることはありません。 つまり、「4はハッピー数ではない」ということが言えます。 <ーーーここまでが、脱出条件です。 あるいは・・・ while (n > 1) and (n not in s):・・・1以上かつ『今まで出てない数値』の間ループ 分かりますか?
alizona

2020/06/24 20:05

理解できたと思います。ありがとうございます。
guest

0

ベストアンサー

根本原因はそこじゃないです。
処理方法が全く間違っています。全面的に考え直しましょう。
質問文の方法では計算過程の合計が一時的にでも100を超えると破綻します。

ヒントは、

  • nを10で割った余りを出すとnの一番下の桁の数字が取得できる
  • nを10で割る(小数点未満切り捨て)と桁を1つ繰り下げることができる

終了条件については、n==1なら成功ですが、もしいつまでたってもnが1にならなければ無限ループです。
計算結果はnに対して一意に決まるので、計算過程で出てくるnを記録して同じ値が出現したら無限に続くとみなせるかと思います。

投稿2020/06/24 04:47

編集2020/06/24 05:07
hope_mucci

総合スコア4447

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

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

hope_mucci

2020/06/24 04:47

なお、質問のコードはn=2で早くも破綻します。
hope_mucci

2020/06/24 05:15

自分で作った検証プログラムが間違ってました。並びに不適切な内容を修正しました。申し訳ない。
alizona

2020/06/24 07:04

お礼の返信遅くなり申し訳ありません。 1時間ほど、考えたり、サンプルを調べたりしていたのですが、まだ理解できなく、今2amなので、明日起きてからやることにしました。あまりを使った考え方は理解しました。明日は、10でわるというとこから考えたいと思います。
alizona

2020/06/24 20:26

遅くなりました。全て理解することができました。 ありがとうございました。 コードは、質問の下あたりに足しておきます。
guest

0

エラーの原因
one=n-hun100+ten10;
10の桁を加算しているので、1の桁の数字となりません。

whileループを終える条件
永久ループになる場合に終了 ⇔ 過去のnと一致した、を追加する必要があると思います。

投稿2020/06/24 04:40

YT0014

総合スコア1750

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

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

alizona

2020/06/24 04:50

it loops endlessly in a cycle which does not include 1. という質問文では、永久ループの場合に終了するということを行っていたのですね。 そして、どのようにして永久ループと判断するかというと、過去のnを保管して、一致したかどうかを確認するということでしょうか?
YT0014

2020/06/24 05:00

過去のnと一致する>その次の値は、過去のnの次の値>...となり、同じ回数の処理で、また、そのnと一致します。 なお、hope_mucciさんのご指摘の、各桁の数字の取得方法改善や桁数制限もご検討ください。剰余演算子を検索してみてください。
alizona

2020/06/24 05:10

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問