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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

1366閲覧

高速化について全くわからないので教えて欲しいです。入力した値に近い素数を見つけるという課題なのですが入力した値が大きい場合、処理できず反応しません。提出が火曜の夜までなので助けて下さい、、

nopainnogain

総合スコア0

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/06/06 12:38

編集2021/06/06 12:55

前提・実現したいこと

高速化(大きい値を入力しても処理できるようになりたい)

C言語の授業でVsコードを使っています。今プログラミングをしたのは入力した値に近い素数を見つけるというものです。
高速化ができてないため数が大きいと処理できません。助けて下さい、、提出火曜の夜までなんです、、

//説明

#include<stdio.h>
long long main(void){
long long N, D;

//整数Nの設定
printf("正の整数Nを入力してください。");
scanf("%lld", &N);

//error判定
if(N<=0){
printf("もう一度入力して下さい。");
return 0;
}

// i=0から始まりマイナスしていく
else{
for (long long i = 0;;i--){

// D=0スタート
D=0;

// j=1スタートでプラスしていく、jはN+i以下で設定
for (long long j=1;j<=N+i;j++){

// N+iをjで割った時のあまりが0
if((N+i)%j == 0){

// Dに足していく
D++;
}
}

// 約数が2個の時
if(D==2){
printf("%lldに近い素数は",N);
printf("%lldです。\n", N+i);

// 素数を見つけたからおしまい
break;
}
}
}
return 0;
}
//

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

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

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

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

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

Zuishin

2021/06/06 12:55

エラトステネスの篩を使ってください。 十分時間はあります。
nopainnogain

2021/06/06 13:01

エラトステネスの篩とはなんですか? 詳しく聞きたいです。
Zuishin

2021/06/06 13:02

Google というサイトを知りませんか?
nopainnogain

2021/06/06 13:05

仕組みはなんとなく理解したのですがそこからプログラミングすることができません
m.ts10806

2021/06/06 21:36

>調べてもよくわかりません、、 質問に何も書いてなければ調べてないのと同じです。 見るのは赤の他人ですから。
guest

回答2

0

// j=1スタートでプラスしていく、jはN+i以下で設定
for (long long j=1;j<=N+i;j++){

N+i=10の場合の約数は1,2,5,10ですが10%2=010%5=010/2=5より自明です。
つまり、j<=sqrt(N+i)までで十分です。
また、2以外すべての素数は奇数なので、2だけループの外に出せばj++ではなくj+=2でよいことになります。

さらに高速化したい場合、32bitまでの素数を全て事前に計算しておけば64bitまでの合成数は全て32bitの素数で割り切れます。
もっと高速化したい場合、ミラーラビンテストを2,325,9375,28178,450775,9780504,1795265022で行います。

投稿2021/06/06 13:20

asm

総合スコア15147

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

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

nopainnogain

2021/06/06 13:29

わかりやすい回答ありがとうございます! とりあえずやってみます。
asm

2021/06/07 07:59 編集

コードを見ていてもう一つ気づきました。 全ての約数を求めてそれが2個である数を素数としていますが jがN+iではないときに、2か3以上の数jで割り切れたらその時点で合成数という事になります。
guest

0

入力した値が大きい場合、処理できず反応しません。

入力値の上限設定がない以上、いくら対応しても限界が来ます。
設問に問題がある以上、回答は無理かと。

投稿2021/06/06 13:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問