C++を用いた「入力された数値分素数を出力するプログラム」

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ライズ

C++を用いた「入力された数値分素数を出力するプログラム」

#1

投稿記事 by ライズ » 10年前

件名と同じです。入力された数値分素数を出力するプログラムを作りたいと考えています。

例:入力:3 出力:1.2.3
入力:6 出力:1.2.3.5.7.11

という風なプログラムです。

自分なりに考えてみたのですが、

形態としては2重ループの形態になると予想しています。
外側のループで入力された数値分の回数ループする条件を内側のループで素数の出力を行うようになると考えています。
内側のループの素数判断がうまくできません。
入力された数値が素数かどうかの判別をするプログラムは組めるのですが・・・・

どのように組めばよいでしょうか

box
記事: 2002
登録日時: 14年前

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#2

投稿記事 by box » 10年前

ライズ さんが書きました: 例:入力:3 出力:1.2.3
入力:6 出力:1.2.3.5.7.11
1は素数とみなさないと思います。
ライズ さんが書きました: 外側のループで入力された数値分の回数ループする条件を内側のループで素数の出力を行うようになると考えています。
内側のループの素数判断がうまくできません。
今のコードを見せてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ライズ

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#3

投稿記事 by ライズ » 10年前

int nyuuryoku;


cout << "数値入力";
cin >> nyuuryoku;

for (int kaisuu = 1; kaisuu < nyuuryoku; kaisuu++) //入力された回数分ループ
{
for ()
}

内側ループが全くかけていない状態です。
1は素数じゃないんですか・・・無知で申し訳ありませんでした。
出力は2.3.5.7....でお願いします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#4

投稿記事 by みけCAT » 10年前

ライズ さんが書きました:入力された数値が素数かどうかの判別をするプログラムは組めるのですが・・・・
このプログラムを見せていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ライズ

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#5

投稿記事 by ライズ » 10年前

int sosuu;
int flag=1; //flag=0は素数ではない,flag=1は素数//
printf("素数を判定します:");
scanf("%d",&sosuu);

if(sosuu==1)
{
printf("入力された数値は素数ではありません\n");
}
else
{
for(int judge=2;judge<sosuu&&flag==1;judge++)
{
if(sosuu%judge==0)
{
flag=0;
}
}

if(flag==1)
{
printf("入力された数値は素数です\n");
}
else
{
printf("入力された数値は素数ではありません\n");
}

}

こちらになります。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#6

投稿記事 by みけCAT » 10年前

とりあえず、適当に組み合わせて、次の素数を線形探索するようにすればいいと思います。

コード:

#include <iostream>
using std::cin;
using std::cout;

int sosuukahanntei(int sosuu)
{
//int sosuu;
	int flag=1;  //flag=0は素数ではない,flag=1は素数//
	//printf("素数を判定します:");
	//scanf("%d",&sosuu);

	if(sosuu==1)
	{ 
		return 0;
		//printf("入力された数値は素数ではありません\n");
	}
	else
	{
	for(int judge=2;judge<sosuu&&flag==1;judge++)
	{
	if(sosuu%judge==0)
	{
		flag=0;
	}
	}

	if(flag==1)
	{
		return 1;
		//printf("入力された数値は素数です\n");
	}
	else
	{
		return 0;
		//printf("入力された数値は素数ではありません\n");
	}

	}
}

int main(void)
{
int nyuuryoku;
int imanokazu=1;
	    

	cout << "数値入力";
	cin >> nyuuryoku;

	for (int kaisuu = 1; kaisuu <= nyuuryoku; kaisuu++)    //入力された回数分ループ
	{
		for (;sosuukahanntei(imanokazu)==0;imanokazu++);
		if(kaisuu>1)
		{
			cout << ".";
		}
		cout << imanokazu;
		imanokazu++;
	}
	cout << std::endl;

return 0;
}
※原文のインデントを尊重しています
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#7

投稿記事 by box » 10年前

1)素数の個数をゼロで初期化する。
2)2以降の数について、順にチェックしていく。たぶん、for文によるループ。
  ・当該の数が素数ならば、素数の個数をインクリメントする。
    素数の個数が所定の数以下ならば、当該の数を出力する。
    素数の個数が所定の個数を超えたら、ループを抜ける。

もっと効率のいい方法があると思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ライズ

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#8

投稿記事 by ライズ » 10年前

ご丁寧にありがとうございます。
用いてるソフトがvisualstudioなので、うまくいかないのですが、

これで、出力できるのでしょうか

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#9

投稿記事 by みけCAT » 10年前

ライズ さんが書きました:用いてるソフトがvisualstudioなので、うまくいかないのですが、

これで、出力できるのでしょうか
Wandboxでは全く警告されずに実行できています。
エラーメッセージが出ている場合は、それを教えてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ライズ

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#10

投稿記事 by ライズ » 10年前

エラー 1 error C2601: 'sosuukahanntei' : ローカル関数の定義が正しくありません。
エラー 2 error C2601: 'main' : ローカル関数の定義が正しくありません。
エラー 3 error C1075: 左側 中かっこ '{' に対応するものがありません

ですかね

int sosuukahanntei(int sosuu) という表現も用いないのでよくわかっていません

まだまだ初心者でイライラさせてしまうかもしれませんがスミマセン

ライズ

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#11

投稿記事 by ライズ » 10年前

#include "stdafx.h"
using namespace std;
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
int sosuukahanntei;
int sosuu;
{

int flag = 1; //flag=0は素数ではない,flag=1は素数//

if (sosuu == 1)
{
return 0;
//printf("入力された数値は素数ではありません\n");
}
else
{
for (int judge = 2; judge<sosuu&&flag == 1; judge++)
{
if (sosuu%judge == 0)
{
flag = 0;
}
}

if (flag == 1)
{
return 1;
//printf("入力された数値は素数です\n");
}
else
{
return 0;
//printf("入力された数値は素数ではありません\n");
}

}
}

int nyuuryoku;
int imanokazu = 1;


cout << "数値入力";
cin >> nyuuryoku;

for (int kaisuu = 1; kaisuu <= nyuuryoku; kaisuu++) //入力された回数分ループ
{
for (; sosuukahanntei(imanokazu) == 0; imanokazu++);
if (kaisuu>1)
{
cout << ".";
}
cout << imanokazu;
imanokazu++;
}



return 0;
}

sosuukahantei(sosuu) という風な表現を使ったことがないので、aaa(bbb)となっているところは理解が出来ていません。
また、 // を用いてコメントにしているところは必要ないという判断でいいでしょうか

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#12

投稿記事 by みけCAT » 10年前

ライズ さんが書きました:sosuukahantei(sosuu) という風な表現を使ったことがないので、aaa(bbb)となっているところは理解が出来ていません。
main以外の関数を定義しない形に書きなおしてみました。

コード:

#include <iostream>
using std::cin;
using std::cout;

int main(void)
{
	int nyuuryoku;
	int imanokazu=1;


	cout << "数値入力";
	cin >> nyuuryoku;

	for (int kaisuu = 1; kaisuu <= nyuuryoku; kaisuu++)    //入力された回数分ループ
	{
		for (;;imanokazu++)
		{
			int sosuu=imanokazu;
			int flag=1;  //flag=0は素数ではない,flag=1は素数//
			//printf("素数を判定します:");
			//scanf("%d",&sosuu);

			if(sosuu==1)
			{ 
				//printf("入力された数値は素数ではありません\n");
			}
			else
			{
				for(int judge=2;judge<sosuu&&flag==1;judge++)
				{
					if(sosuu%judge==0)
					{
						flag=0;
					}
				}

				if(flag==1)
				{
					break; // 素数が見つかったので、線形探索から抜ける
					//printf("入力された数値は素数です\n");
				}
				else
				{
					//printf("入力された数値は素数ではありません\n");
				}

			}
		}
		if(kaisuu>1)
		{
			cout << ".";
		}
		cout << imanokazu;
		imanokazu++;
	}
	cout << std::endl;

	return 0;
}
ライズ さんが書きました:また、 // を用いてコメントにしているところは必要ないという判断でいいでしょうか
はい。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ライズ

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#13

投稿記事 by ライズ » 10年前

ご丁寧にありがとうございます。
無事に出力できました。

cout << std::endl; というのを基本的に使わないのですがどういう役割を果たしているのですか?
あと、出来る限りbreakを使いたくないのですが、使わない方法はありますでしょうか

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#14

投稿記事 by みけCAT » 10年前

ライズ さんが書きました:cout << std::endl; というのを基本的に使わないのですがどういう役割を果たしているのですか?
改行を出力する、という役割を果たしています。

コード:

cout << "\n";
としてもいいです。(flushされるかなどの違いがあるかもしれませんが)
ライズ さんが書きました:あと、出来る限りbreakを使いたくないのですが、使わない方法はありますでしょうか
gotoに置き換えるのが簡単です。

コード:

#include <iostream>
using std::cin;
using std::cout;

int main(void)
{
	int nyuuryoku;
	int imanokazu=1;


	cout << "数値入力";
	cin >> nyuuryoku;

	for (int kaisuu = 1; kaisuu <= nyuuryoku; kaisuu++)    //入力された回数分ループ
	{
		for (;;imanokazu++)
		{
			int sosuu=imanokazu;
			int flag=1;  //flag=0は素数ではない,flag=1は素数//
			//printf("素数を判定します:");
			//scanf("%d",&sosuu);

			if(sosuu==1)
			{ 
				//printf("入力された数値は素数ではありません\n");
			}
			else
			{
				for(int judge=2;judge<sosuu&&flag==1;judge++)
				{
					if(sosuu%judge==0)
					{
						flag=0;
					}
				}

				if(flag==1)
				{
					goto sosuuhakkenn; // 素数が見つかったので、線形探索から抜ける
					//printf("入力された数値は素数です\n");
				}
				else
				{
					//printf("入力された数値は素数ではありません\n");
				}

			}
		}
		sosuuhakkenn:
		if(kaisuu>1)
		{
			cout << ".";
		}
		cout << imanokazu;
		imanokazu++;
	}
	cout << std::endl;

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ライズ

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#15

投稿記事 by ライズ » 10年前

ご丁寧にありがとうございました。

無事に完成することが出来ました。

素早い対応のおかげで理解しやすかったです。

本当にありがとうございました。

かずま

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#16

投稿記事 by かずま » 10年前

break も goto も flag も使わないようにしてみました。

コード:

#include <iostream>

int main()
{
    using namespace std;
    cout << "input number: ";
    int n = 0;
    cin >> n;
    for (int k = 0, i = 2; k < n; i++) {
        int j;
        for (j = 2; i % j; j++) ;
        if (j == i) {
            if (k) cout << '.';
            cout << i;
            k++;
        }
    }
    cout << '\n';
}

RaiseBB
記事: 6
登録日時: 10年前

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#17

投稿記事 by RaiseBB » 10年前

カズマさんありがとうございました。

質問主であるライズです。
返信が遅れてしまい申し訳ありません。

go toやbreakを使わないやり方が存在するとは思ってもいませんでした。

精進していきたいと思います

ありがとうございました。

RaiseBB
記事: 6
登録日時: 10年前

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#18

投稿記事 by RaiseBB » 10年前

for (j = 2; i % j; j++);
if (k)

この二つについて質問があります。

上のforの継続条件?である、i%jとはどのときに終了するという処理なのでしょうか
下のifについては、if分の中にif(k)とあり、そのifの後ろには{}がついていません
どのような意味合いを持つのでしょうか

解決済みとしたのに質問が出てしまいスミマセン

かずま

Re: C++を用いた「入力された数値分素数を出力するプログラム」

#19

投稿記事 by かずま » 10年前

for文は、

 for (式1; 式2; 式3) 文

という構文で、「式1」を評価し、「式2」を評価し、
その値が 0 でない場合、「文」を実行し、「式3」を評価し、また「式2」の評価に戻ります。
「式2」の値が 0 の場合、for文を終了し、次の文に進みます。

例えば、「式2」が k < n だった場合、比較演算子 < は、
k が n より小さい時、演算結果の値が 1 となり
k が n 以上の時、演算結果の値が 0 になります。

「式2」が i % j だった場合、剰余演算子 % は
i を j で割った余りを演算結果の値とします。
それが 0 かそうでないかで、for文を終了するか継続するかが決まります。

if 文は、

 if (式) 文

という構文で、「式」を評価し、その値が 0 でなかったら「文」を実行します。

if (k) cout << '.'; で、最初 k は 0 ですから、
cout << '.'; という文は実行されません。
次からは k が 0 ではありませんから、cout << '.'; という文が実行されます。

この構文で、文は 1つしか書けませんから、2つ以上の文を書きたい場合は、
{ 文1 文2 ... } のように { } を使って、1つの文にします。
{ 文1 } のように中の文は 1つでも構いませんし、
{ } のように1中の文が 0個でも構いません。
文が 1つのときは { } は不要ということです。

閉鎖

“C言語何でも質問掲示板” へ戻る