SyuchiNikuRingの備忘録

お勉強したことをまとめておく場所。中の人の理解や感覚で書いているから不正確なことも多いかも。

各位の数字をゲットしたり平方数か判定したり。

前回に平方数か否かを判定せよという問題が出て,その判定する数を得るためにstoi使いましたという話をしました。

 

今日はその続きと整数の各位の数字をゲットしよう!というお話です。

 

さてさて,前回はstoiを使って無事整数を連結させることに成功した上,連結したものを整数型に直しました。

具体的には,A=5, B=22のとき,string A,Bとして二つの入力A,Bを取得。

B+Aで225とする。だって文字列だもん。

文字列で“+”を使うと単に連結されるだけです。数字でも文字列として扱えば連結されるだけです。いわゆる足し算はされません。

そして,整数型に直すためにstoi(B+A)としておけば,225は晴れてint型になる,というわけです。

 

そんなこんなして得られた整数225が平方数か判定しましょう。

1番手っ取り早いのは,平方根を取って,もう一度二乗して元の数に戻るかを調べることです。

int x = (int)sqrt((double)225)

とすると,xは225の平方根から小数点以下を切り捨てたものになります。

何をしているのかというと,

(double)225のところで,ここだけ整数225を小数として扱いますよ,としています。

小数の範囲まで広げて平方根を取ろうということです。

 

そうしないと,例えば,31は1000の平方根だよ,みたいな無茶苦茶なことが発生します。1000の平方根は31.62…であり,31ではありません。

intは整数の範囲でしか数を扱わないので,平方根を考える場合には不適です。

 

そして,sqrtで平方根をとります。(double)1000で計算時には小数まで計算できるようにしておき,sqrt((double)1000)とすると,1000の平方根を小数の範囲まで計算してくれます。つまり,31.62…を得られるわけです。

 

平方数は同じ整数の二乗なので,平方根の小数部分が邪魔です。なので一番外側でintに戻します。そうすると31が得られます。

あとは31を二乗して1000になるのかを判定して終わりです。この場合はならないですよね。

 

int x = (int)sqrt((double)1000)

で何をしているのか,をおさらいすると,

 

1000を小数の範囲まで扱えるようにdouble型にしてから平方根をとる。小数の範囲まで計算された平方根を整数に直す

 

ということをしています。簡単でしょ。

 

突然例えが1000とか31とかになってしまいましたが,225でも同じことです。

(double)225をsqrt()に放り込むと15.0となります。15.0をint型に直し15。15を二乗して225となり,元の数と一致したので225は平方数といえる。

 

元の数が大きいと少し時間がかかるかもね,ってところです。

 

各位の数字をゲットしよう!のお話。

結論から言うと,値を10で割って更新しながらwhile使ってループするんですよね。

 

どういうことか。実際にやってみよう!

n=12345とします。

while(n>0){

 cout << n % 10 <<endl;

n = n / 10;

}

としておけば,結果は,

5

4

3

2

1

となります。endl入ってるので改行されます。

エディタの画像挟み込めやというツッコミが来そうですが,許してください。スマホから打ってるんですよ。

 

そんなことはさておき,何してんの?ってことですが,各位の数字を得たければ,10で割った余りを取り出し続けていけば良いですよね。

10で割った余り→一の位の数字5ゲット

数字を10で割る(intなので1234.5は1234となる)

また10で割った余り→4

以下飽きるまで繰り返し

これだけです。