質問: myCalc(b, p); b++; printf("b:%d\n", b); }else{ printf("%d\n", max); return 0; } printf("***\n"); } } ``` ### 試したこと プリントデバッグで、stopまでしか表示されないことがわかりました。 理由がわかりません。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: こんにちは、原因の方はほかの方の回答にあるのでここでは別解を言いたいと思います。 参考になったら幸いです。 ソースを見た感じ少しfor文の中が複雑になっているのでもっと簡潔にできないかなぁと思いました。 まず例の10の時ですが、10に最も近いべき乗数を求めるとき底の最大値は√10の整数部分の3となり、そこから指数部分を2から1ずつ増やし10を超えないべき乗数まで算出します。 ### なぜ底の最大値は平方根の整数部分なのか べき乗数の指数部分の最小値は2です。つまり、底が平方根の指数部分を超えると入力した値より大きいべき乗数が出ます。例の10の時、例えば4のべき乗を考えると4^2 > 10となり計算する必要はありません。 つまり、底が3以下の場合のべき乗数で10以下のものだけを考えればいいことになります。 ### 話を戻します。 実際に、計算すると 2^2 = 4 , 2^3 = 8 (2^4 = 16は10を超えるので底が2のループは終了) 3^2 = 9, (3^3 = 27は10を超えるので底が3のループは終了) となり、最大値は9となります。べき乗数を求め、より大きいものが出るとき最大値が更新するようにします。これを2重for文でやればいいです。 ``` int answer = 1; for(i = 2; pow(i,2) <= n; i++){ for(j = 2; pow(i,j) <= n; j++){ if(answer <= pow(i,j)){ answer = pow(i,j); } } } printf("%d\n",answer); ``` for文の条件文のところに <=と イコールを付けることで入力した数値がべき乗数の時も対応しています。 また、入力した数値が1の時ですが、このときはまずfor文を通らないので初期値answer = 1が答えとなります。 ### ちなみに 私も最初はaのb乗を求める関数を自分で作ってました。しかし、C言語にはをインクルードすると pow関数を使うことができます。pow(a,b)はaのb乗を表しています。 詳しくはpow関数をご覧ください。