• ベストアンサー

C言語

これで入れた数字を素因数分解する事が出来ません。また間違っている理由がわからないのでご指摘お願いします。

この投稿のマルチメディアは削除されているためご覧いただけません。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6642/9410)
回答No.1

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% (1522/2216)
回答No.3

C言語では関数内関数を定義することはできません。factorize()の中でprimefactorization()を定義していますが、これはコンパイルエラーになります。 また、if (nn == n) { ... }のチェックは不要で、いきなりnの値を出力すればいいです。 それから、たとえば入力値が2のときに2 = 2 * 1と表示される問題があります。4とか8でも同様。 再帰関数の練習ならいいですが、この処理は再帰を使わないほうが簡潔に書けます。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.2

質問のコードが分かりませんが、 long long は64bit以上の整数型です

関連するQ&A

  • C言語 因数分解

    素因数分解する事が出来ません。また間違っている理由がわからないので何をどう直せば良いか理由を付けてご指摘お願いします。

  • c言語 至急お願い致します

    10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. 出力形 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 因子数:13

  • 素因数分解について

    中学三年で習う素因数分解についてです。 素因数分解をするときに、数字を最小の素数で割らなければいけない理由は何ですか? また、素因数分解を利用して最大公約数と最小公倍数を求めるための式(共通の素数をかけていくという式です)の意味が理解できません。。 何故あの式で最小公倍数と最大公約数が出るんでしょうか? テストが近いのでかなり焦っています。 どなたか詳しく説明してくださる方、回答よろしくお願いします。

  • 素因数の個数

    100!を素因数分解したとき、素因数3はいくつあるか? で 100割る3=33で間違いであるりゆうを教えて下さい。

  • 素数の素因数分解

    素数(例えば17)の素因数分解について  (1)すでに素因数分解は終わっている (17の素因数分解は17)  (2)素因数分解はできない のどちらの見解が正しいですか?

  • C言語に詳しい方、ご指導をお願いします。

    C言語を今勉強しています。 ある調べたい数値を入力して、txtの中に入っている数字(10000までの素数)を読み込み、その素数たちを利用して素因数分解しようとしています。 しかし、何度試しても読み込みだけしか行われず、 調べたい数値を入力することすらできません。 どこに問題があるのでしょうか、ぜひご指導をお願いします。 今作成しているプログラムです。 #include<stdio.h> void main(void) {int i,k,num,p[10000]; {for(i=0;scanf("%d",&p[i])!=EOF;i++){} num=i; } printf("素因数分解したい整数は?\n"); scanf("%ld",&k); printf("%ld=",k); while(p[i]<=num) { for(i=0;p[i]<=num;i++) {if((k%p[i])==0) {printf("%ld*",p[i]); k=k/p[i]; break; } } } printf("%ld\n",k); } txtの中身 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71             ・             ・             ・ 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 9901 9907 9923 9929 9931 9941 9949 9967 9973

  • 二重ループを使うプログラムについて(C言語)

    素因数分解するプログラムで、例えば360を入力したとき、 2^3 * 3^2 * 5^1 と表示するプログラムを作りたいのですが、scanfとprintfの部分は分かるのですが、肝心の二重ループの部分が分かりません…。 最後に*が表示されないようにするというのが条件なのですが、初心者で慣れてないので、詳しく教えていただけないでしょうか?

  • 息子に言われてぐうの音も出ない

    中3の息子を持つ母です。 先日息子の数学を見ていたら、素因数分解をしていたのですが、とにかく意味がわからない、とさじを投げておりました。 必殺の「こんなの将来役に立たなねーし」の連発。 わかる、わかるよ、私もそう思った! で、今回質問したいのは、はてさて素因数分解って、大人社会では役に立つの? と、いう事です。 勿論実際に数字で素数が何とか、なんてしやしない事くらい私も経験上わかります。 そうではなく、素因数分解を知っている事で、その考え方はどんなシチュエーションで活かせるのか。 学のある人は頭の回転が速く仕事も効率的ですよね、それってきっと様々な数学的な発想だったり、勿論他の知識も総合的に組み合わさってのものだと思うのですが、どの様な場面で素因数分解の考え方が活きてくるのか。 もしかしたら知らず知らず使っているのかもしれませんが、実際息子に言われて反論出来ない自分がいて、何とも悔しくモヤモヤしてまして。 学のある皆様、どうかよろしくお願いします。

  • 因数分解の文章題です。

    何度してもしっくりきません。 (1)252に自然数aをかけて、その結果の数がある数の2乗になるようにしたい。このような自然数aのうちで、もっとも小さいものを求めよ。 (問題の意味さえピンときません・・・・) 252を素因数分解すると 2^2×3^2×7 答えでは2乗でないものを選ぶと7 答え7 (2)300に自然数aをかけて、その結果の数がある数の2乗になるようにしたい。このような自然数aのうちで、もっとも小さいものを求めよ。 300を素因数分解すると 3×2^2×5^2 答え3 (類題)素因数分解の結果が2×3×4^2の場合 (類題)素因数分解の結果が2^2×3^2の場合はこたえはどのようになるのでしょうか?またその理由もお願いします。

  • 100!を素因数分解すると2^a、3^b、5^c、

    100!を素因数分解すると2^a、3^b、5^c、7^16、11^9、13^7…となる。a,b,cの値を求めよ。 という数A 整数の問題です。 画像は解答なのですが、何をしているのかわかりません。なぜ素因数の数?を調べるのですか?重複しないのですか?

専門家に質問してみよう