- ベストアンサー
C言語
これで入れた数字を素因数分解する事が出来ません。また間違っている理由がわからないのでご指摘お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
long long は浮動小数点値です。 浮動小数点を用いた演算には、必ず誤差が生じます。 それは何かと言えば、9.0 % 3 と言う演算が、厳密な0にならなかったりするのです。 割り算した結果、0.000000000123 とかになれば、それはもう 0 とは等しくなりません。 それで、「割り切れた」という判定が出来なくなってしまうのです。 数値を扱う変数および演算を、全て整数値(int または long int)で保存・演算するように書き直してみてください。 intの 9 を intの 3 で割った余りは、厳密な0となり、「==0」で判定できます。 (計算途中に一つでも浮動小数点値が入ると、全てが浮動小数点値に昇格されて、誤差の問題が発生してしまいますから注意) まあこのことは高級アセンブラであるC言語の話なので、もっと高級な言語ではものすごく小さい値はゼロと見なしてくれる場合もあります。 別の方法としては、「==0」でなく「<0.0001」とかすれば、だいたい約数を表示してくれると思います。 ただ、入力数値がものすごく大きくなったときに、誤動作する可能性がありますけど。
その他の回答 (2)
- _kappe_
- ベストアンサー率68% (1581/2304)
C言語では関数内関数を定義することはできません。factorize()の中でprimefactorization()を定義していますが、これはコンパイルエラーになります。 また、if (nn == n) { ... }のチェックは不要で、いきなりnの値を出力すればいいです。 それから、たとえば入力値が2のときに2 = 2 * 1と表示される問題があります。4とか8でも同様。 再帰関数の練習ならいいですが、この処理は再帰を使わないほうが簡潔に書けます。
- wormhole
- ベストアンサー率28% (1626/5665)
質問のコードが分かりませんが、 long long は64bit以上の整数型です