C++を用いた「入力された数値分素数を出力するプログラム」
C++を用いた「入力された数値分素数を出力するプログラム」
件名と同じです。入力された数値分素数を出力するプログラムを作りたいと考えています。
例:入力:3 出力:1.2.3
入力:6 出力:1.2.3.5.7.11
という風なプログラムです。
自分なりに考えてみたのですが、
形態としては2重ループの形態になると予想しています。
外側のループで入力された数値分の回数ループする条件を内側のループで素数の出力を行うようになると考えています。
内側のループの素数判断がうまくできません。
入力された数値が素数かどうかの判別をするプログラムは組めるのですが・・・・
どのように組めばよいでしょうか
例:入力:3 出力:1.2.3
入力:6 出力:1.2.3.5.7.11
という風なプログラムです。
自分なりに考えてみたのですが、
形態としては2重ループの形態になると予想しています。
外側のループで入力された数値分の回数ループする条件を内側のループで素数の出力を行うようになると考えています。
内側のループの素数判断がうまくできません。
入力された数値が素数かどうかの判別をするプログラムは組めるのですが・・・・
どのように組めばよいでしょうか
Re: C++を用いた「入力された数値分素数を出力するプログラム」
1は素数とみなさないと思います。ライズ さんが書きました: 例:入力:3 出力:1.2.3
入力:6 出力:1.2.3.5.7.11
今のコードを見せてください。ライズ さんが書きました: 外側のループで入力された数値分の回数ループする条件を内側のループで素数の出力を行うようになると考えています。
内側のループの素数判断がうまくできません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: C++を用いた「入力された数値分素数を出力するプログラム」
int nyuuryoku;
cout << "数値入力";
cin >> nyuuryoku;
for (int kaisuu = 1; kaisuu < nyuuryoku; kaisuu++) //入力された回数分ループ
{
for ()
}
内側ループが全くかけていない状態です。
1は素数じゃないんですか・・・無知で申し訳ありませんでした。
出力は2.3.5.7....でお願いします
cout << "数値入力";
cin >> nyuuryoku;
for (int kaisuu = 1; kaisuu < nyuuryoku; kaisuu++) //入力された回数分ループ
{
for ()
}
内側ループが全くかけていない状態です。
1は素数じゃないんですか・・・無知で申し訳ありませんでした。
出力は2.3.5.7....でお願いします
Re: C++を用いた「入力された数値分素数を出力するプログラム」
このプログラムを見せていただけますか?ライズ さんが書きました:入力された数値が素数かどうかの判別をするプログラムは組めるのですが・・・・
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C++を用いた「入力された数値分素数を出力するプログラム」
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");
}
}
こちらになります。
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");
}
}
こちらになります。
Re: C++を用いた「入力された数値分素数を出力するプログラム」
とりあえず、適当に組み合わせて、次の素数を線形探索するようにすればいいと思います。
※原文のインデントを尊重しています
#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で殴ればいい!(死亡フラグ)
Re: C++を用いた「入力された数値分素数を出力するプログラム」
1)素数の個数をゼロで初期化する。
2)2以降の数について、順にチェックしていく。たぶん、for文によるループ。
・当該の数が素数ならば、素数の個数をインクリメントする。
素数の個数が所定の数以下ならば、当該の数を出力する。
素数の個数が所定の個数を超えたら、ループを抜ける。
もっと効率のいい方法があると思います。
2)2以降の数について、順にチェックしていく。たぶん、for文によるループ。
・当該の数が素数ならば、素数の個数をインクリメントする。
素数の個数が所定の数以下ならば、当該の数を出力する。
素数の個数が所定の個数を超えたら、ループを抜ける。
もっと効率のいい方法があると思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: C++を用いた「入力された数値分素数を出力するプログラム」
ご丁寧にありがとうございます。
用いてるソフトがvisualstudioなので、うまくいかないのですが、
これで、出力できるのでしょうか
用いてるソフトがvisualstudioなので、うまくいかないのですが、
これで、出力できるのでしょうか
Re: C++を用いた「入力された数値分素数を出力するプログラム」
Wandboxでは全く警告されずに実行できています。ライズ さんが書きました:用いてるソフトがvisualstudioなので、うまくいかないのですが、
これで、出力できるのでしょうか
エラーメッセージが出ている場合は、それを教えてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C++を用いた「入力された数値分素数を出力するプログラム」
エラー 1 error C2601: 'sosuukahanntei' : ローカル関数の定義が正しくありません。
エラー 2 error C2601: 'main' : ローカル関数の定義が正しくありません。
エラー 3 error C1075: 左側 中かっこ '{' に対応するものがありません
ですかね
int sosuukahanntei(int sosuu) という表現も用いないのでよくわかっていません
まだまだ初心者でイライラさせてしまうかもしれませんがスミマセン
エラー 2 error C2601: 'main' : ローカル関数の定義が正しくありません。
エラー 3 error C1075: 左側 中かっこ '{' に対応するものがありません
ですかね
int sosuukahanntei(int sosuu) という表現も用いないのでよくわかっていません
まだまだ初心者でイライラさせてしまうかもしれませんがスミマセン
Re: C++を用いた「入力された数値分素数を出力するプログラム」
#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)となっているところは理解が出来ていません。
また、 // を用いてコメントにしているところは必要ないという判断でいいでしょうか
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)となっているところは理解が出来ていません。
また、 // を用いてコメントにしているところは必要ないという判断でいいでしょうか
Re: C++を用いた「入力された数値分素数を出力するプログラム」
main以外の関数を定義しない形に書きなおしてみました。ライズ さんが書きました:sosuukahantei(sosuu) という風な表現を使ったことがないので、aaa(bbb)となっているところは理解が出来ていません。
#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++を用いた「入力された数値分素数を出力するプログラム」
ご丁寧にありがとうございます。
無事に出力できました。
cout << std::endl; というのを基本的に使わないのですがどういう役割を果たしているのですか?
あと、出来る限りbreakを使いたくないのですが、使わない方法はありますでしょうか
無事に出力できました。
cout << std::endl; というのを基本的に使わないのですがどういう役割を果たしているのですか?
あと、出来る限りbreakを使いたくないのですが、使わない方法はありますでしょうか
Re: C++を用いた「入力された数値分素数を出力するプログラム」
改行を出力する、という役割を果たしています。 としてもいいです。(flushされるかなどの違いがあるかもしれませんが)ライズ さんが書きました:cout << std::endl; というのを基本的に使わないのですがどういう役割を果たしているのですか?
gotoに置き換えるのが簡単です。ライズ さんが書きました:あと、出来る限りbreakを使いたくないのですが、使わない方法はありますでしょうか
#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++を用いた「入力された数値分素数を出力するプログラム」
ご丁寧にありがとうございました。
無事に完成することが出来ました。
素早い対応のおかげで理解しやすかったです。
本当にありがとうございました。
無事に完成することが出来ました。
素早い対応のおかげで理解しやすかったです。
本当にありがとうございました。
Re: C++を用いた「入力された数値分素数を出力するプログラム」
カズマさんありがとうございました。
質問主であるライズです。
返信が遅れてしまい申し訳ありません。
go toやbreakを使わないやり方が存在するとは思ってもいませんでした。
精進していきたいと思います
ありがとうございました。
質問主であるライズです。
返信が遅れてしまい申し訳ありません。
go toやbreakを使わないやり方が存在するとは思ってもいませんでした。
精進していきたいと思います
ありがとうございました。
Re: C++を用いた「入力された数値分素数を出力するプログラム」
for (j = 2; i % j; j++);
if (k)
この二つについて質問があります。
上のforの継続条件?である、i%jとはどのときに終了するという処理なのでしょうか
下のifについては、if分の中にif(k)とあり、そのifの後ろには{}がついていません
どのような意味合いを持つのでしょうか
解決済みとしたのに質問が出てしまいスミマセン
if (k)
この二つについて質問があります。
上のforの継続条件?である、i%jとはどのときに終了するという処理なのでしょうか
下のifについては、if分の中にif(k)とあり、そのifの後ろには{}がついていません
どのような意味合いを持つのでしょうか
解決済みとしたのに質問が出てしまいスミマセン
Re: C++を用いた「入力された数値分素数を出力するプログラム」
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つのときは { } は不要ということです。
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つのときは { } は不要ということです。