質問
ようにしている生素数に基づくユーザー入力します。これは私のこれまでにがんができないようではありませ:
Console.Write("Please enter the number of prime numbers you would like to see:");
int numberOfPrimes = Convert.ToInt32(Console.ReadLine());
for (int x = 0; x < numberOfPrimes; x++)
{
for (int a = 2; a <= x ; ++a)
{
bool prime = true;
for (int b = 2; b < a; ++b)
{
if (a % b == 0)
{
prime = false;
}//end if
}//end double nested for
if (prime == true)
{
Console.WriteLine(a);
}//end if
}//end nested for
}//end for
解決
あなたは、あなたのループ構造を見れば、あなたの結果は非常に簡単に間違っている理由を見ることができるはずです。 (それは時間がかかることはありません)手でそれらを介してステップます。
それが原因内側のループが構成されている方法にかなりの数の反復をスキップします。 -あなたの現在の結果を得ている理由は、外側のループ(x < numberOfPrimes
)のすべての反復は、結果を生成しないことがあります。
あなたが本当に行う必要があることは、内側のループを再構築です。あなたの最も内側のループは正常に動作し、任意の素数を検出する必要があります。あなたの第二のループは、しかし、唯一まだテストされていない番号をテストする必要があります。あなたは素数を見つけたらまた、ループ停止する必要があります。
他のヒント
あなたはより良いあなたのコードを構築する必要があり、それは本当にあなたが今それを行う方法を乱雑です。 IsPrime(int x)
は、そうでない場合は、プライムとfalseの場合はtrueを返すメソッドのx
を持っています。
次に、numberOfPrimes
の素数を生成するために、あなたはこのような何かを行うことができます:
for ( int primeCount = 0, currentPrime = 2; primeCount < numberOfPrimes; ++currentPrime )
if ( IsPrime(currentPrime) )
{
// do whatever you want with currentPrime, like print it
++primeCount;
}
またははるかに速い方法であるふるいエラトステネスのに、使用します。
数のx
が素数であるかどうかを把握するには、2
とSqrt(x)
間その要因のすべてを試してみてください。なぜのみSqrt(x)
?そのためa*b = x
、その後、x / b = a
とx / a = b
場合、あなたは二度、すべてを確認し、そしてまた、あなたがx / 2
あるいはx
まで行きましてはならない場合のことをチェックしますので。
したがって、このような何かあなたがIsPrime(x)
機能を使用する場合:
// i <= Sqrt(x) <=> i * i <= x
for ( int i = 2; i * i <= x; ++i )
if ( x % i == 0 )
return false;
return true;
しかし、私はそれをはるかに高速だとしてあなたは、エラトステネスのふるいを使用することをお勧め。偶数(両方のふるいと素朴な方法で)2を除き、首相になることはありませんので、あなたは、偶数番号をチェックしませんので、あなたはまた、物事を最適化することができます。エッジケースとして、X = 2を処置し、その後、他のすべての番号チェックを開始(3、5、7、9、11など。)
あなたが探していることは「エラトステネスのふるい」と呼ばれています。私は人々の宿題をやってにいないよように、これは私はあなたを与えるつもりだ唯一の手がかりです。このアルゴリズムは、インターネット上で簡単に発見されます。
次の素数(X) - すべての素数秒で割ってもカントの数である、すなわち、
public bool CheckAndAddPrime(int number,List<int> primes)
{
var sqrt = Math.Sqrt(number);
foreach(var prime in primes)
{
if(prime>sqrt) break;
if(number % prime == 0) return false;
}
primes.Add(number);
return true;
}
そして、あなたは
のような素数を得ることができますよりvar primes = new List<int>();
Enumerable.Range(2,int.MaxValue).Where(x => x.CheckAndAddPrime(x,primes)).Take(YouCountOfPrimes);
var primes = Enumerable.Range(1, numberOfPrimes )
.Where(x => x != 1 &&
!Enumerable.Range2, (int)Math.Sqrt(x)).Any(y => x != y && x % y == 0));
<のhref = "http://www.codethinked.com/post/2010/01/10/The-TekPub-LINQ-Challenge-Part-2-Faster-Algorithms.aspx" のrel = "nofollowをnoreferrer" > codethinked.com の
からコピーstatic void Main(string[] args)
{
foreach (int no in get_first_k_primes(10))
{
Console.Write(" "+no.ToString() );
}
}
public static List<int> get_first_k_primes(int k)
{
var primes = new List<int>();
primes.Add(2);
int i = 3;
while(primes.Count < k)
{
if(is_prime(i))
primes.Add(i);
i += 2;
}
return primes;
}
public static bool is_prime(int n)
{
if (n % 2 == 0 && n != 2) return false;
int m = (int)Math.Ceiling(Math.Sqrt(n));
for (int i = 3; i < m; i += 2)
{
if (n % i == 0) return false;
}
return true;
}
1.名前を変更。
まず、この宿題を取得しま悪いマークを使用した場合は、教師は彼の塩るものですか、それとも意味がない変数名あり、 numberOfPrimes
が間違っていて、名 requiredNumberOfPrimes
.する場合はこの変数に私というのはこういたいのに、どのように多く見?').
次に、作成しないようにしてくださいですがおかしい。変数のべき論理的に名前にはどのよういたします。できない場合は説明のほとんど変数表例a-b)しい説明を確認することができました。
2.御社のタイルです。
for (int x = 0; x < numberOfPrimes; x++)
の構造のためのループ (initialise; 'should I continue?'; 'each loop do this')
.そのためにループ
- きを続けてまではxと同一又はそれより大
numberOfPrimes
*. - 各時間のループを追加1
x
.
ご確認くださいここはいかがですか? x
表示を代表する数素数ています。なぜな増分値を利用したいのですが見つかり、より起動する場合はループ?
for (int a = 2; a <= x ; ++a)
for (int b = 2; b < a; ++b)
お探しの各整数2 x
, となります。やっている整数 a
, ごみは毎の整数を a
2が含まれます。あけましておめでとうございまも一緒に戦ってくれるかなというこれらの整数?
毎回のループを通じてトップレベルのループの x
ループ)にお a
ループからは、毎回のループを通じてお a
ループを開始しま b
ループからのスタートでした。
い場合 x
10およ度(a=2のとき、その実行を通じて、再度(a=2のときa=3のとき、その実行を通じて、再度(a=2のときa=3=4)、...
3.取得結果により書き込むことです。
var primes = new List<int>();
でとても簡単です。を探したいときは、 primes.Add(a);
.そのノウハウ素数多くのお客様の購入希望(primes.Count
を使うことができ、リストの素数の効率的な決定は、次盛りに、利用できる、リストの後にする必要があります。
、あなただけの任意の高い、(a)はSQRT