各位の数字をゲットしたり平方数か判定したり。
前回に平方数か否かを判定せよという問題が出て,その判定する数を得るために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
以下飽きるまで繰り返し
これだけです。