質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

509閲覧

素因数 種類 カウント

ta-9

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/04 03:21

###やりたい事
標準入力から正整数 n( 0 < n < 2147483648 )を読み取り、n の素因数が何種類あったかを出力するプログラムの作成

c

1#include <stdio.h> 2 3int main(void){ 4 5 int n,c; 6 7 scanf("%d",&n); 8 // while (n%2==0) ?? 9 // c++; ?? 10 } 11 printf("%d\n",c); 12 return 0; 13}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/05/04 03:26 編集

やりたい事はわかりました。 質問はなんですか?
ta-9

2020/05/04 03:47

2で割り切れるだけ割る→3で割り切れるだけ割る→...割れなくなったら 割れた回数ではなく割った素数の種類をカウントしたいのですが、どうコードを書けばよいのか 教えて頂きたいです。 (while文?for文?を使用?)
episteme

2020/05/04 04:34

それをナゼ質問に書かない?
guest

回答2

0

ベストアンサー

こんなんで。

#include <stdio.h> int main() { int f[11] = { 0 }; int i, n, c; scanf("%d", &n); for (i = 2, c = 0; n > 1; i++) { if (n % i == 0) { do n /= i; while (n % i == 0); f[c] = i; c++; } } printf("%d\n\n",c); for (i = 0; f[i]; i++) printf("%d\n", f[i]); return 0; }

こんなんでいいかな?

#include <stdio.h> int main() { int f[9]; int i, n, c = 0; scanf("%d", &n); if (n % 2 == 0) { do n /= 2; while (n % 2 == 0); f[c] = 2; c++; } if (n % 3 == 0) { do n /= 3; while (n % 3 == 0); f[c] = 3; c++; } // 超過するのを忘れていたので、もうちょっと大きな型にしてください。 for (i = 5; (unsigned)i * i <= n; i += 4) { if (n % i == 0) { do n /= i; while (n % i == 0); f[c] = i; c++; } i += 2; if (n % i == 0) { do n /= i; while (n % i == 0); f[c] = i; c++; } } if (n > 1) { f[c] = n; c++; } printf("%d\n\n", c); for (i = 0; i < c; i++) printf("%d\n", f[i]); return 0; }

投稿2020/05/04 04:47

編集2020/05/04 11:51
PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ta-9

2020/05/04 07:09

ご回答有難うございます。 n が素数だと言うことを知るのに「 n までのすべての整数で割ってみる」以外に何か方法はありますでしょうか?桁数が大きくなってくるととても時間が掛かってしまい。。。 (例えば2147483647を計算するのに2147483647回計算が必要という意味です)
episteme

2020/05/04 08:33 編集

たとえば: 「√pまでのすべての素数で割れなければpは素数」だから 1~pまでの素数表を基に1~p*pまでの素数表が作れる。 これをn回繰り返せば1~2^nまでの素数表が作れる。
PingHermit

2020/05/04 09:56

素数重視なら、epistemeさんが書いている方法(たぶんエラトステネスの篩)で。 素因数重視なら、最初にテーブル作るのはちょっとお勧めできません。
PingHermit

2020/05/04 10:01

いや、epistemeさんだから、何かいい方法知ってるのかも。 作例お願いします>episteme
ta-9

2020/05/04 11:29

ご回答有難うございます。 1度使用した2や3を格納しておき、何度も同じ計算をしないという方法と理解しました。 (間違っていたら申し訳ありません) ただ、正しい出力結果は得られるのですが2147483647の計算の時に膨大な時間が掛かって しまう為、ほかにもっと短縮する方法が無いか考えてみます。
PingHermit

2020/05/04 11:45

チョンボしてました。修正してください。
PingHermit

2020/05/04 11:49

この数値なら、単純に unsigned だけでもカバーできるみたいです。
ta-9

2020/05/04 11:55

ご回答有難うございます。 とても短縮できました。
guest

0

ひんと

if ( n が p で割りきれる ) { ++count; n を p で割れるだけ割る }

を、p = 2, 3, 5, 7, 11 .... (√n以下の素数)に対して行う。

投稿2020/05/04 03:54

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ta-9

2020/05/04 04:28

う~ん、こんな感じ...? if(n%p==0){ count++; while(n%p==0) p++; }
episteme

2020/05/04 04:32

知らんがな。やってみたらええやん。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問