|
I wouldn't waste to much time on OP.
I already told OP that he produced invalid code which OP does somehow not understand or chooses to ignore.
I give up!
Cheers!
"With sufficient thrust, pigs fly just fine."
Ross Callon, The Twelve Networking Truths, RFC1925
|
|
|
|
|
I think actually it's your failing! Its totally understandable what the OP is asking, even if there are some slight misgivings in his code example.
Your comments on this thread are more annoying than his by an order of magnitude.
|
|
|
|
|
I hate to break it to you bubba, but your algorithm isn't that algorithm. You are brute forcing to test against the result of the division to see if the remainder is zero. That's not what this algorithm does; it's a simpler, more elegant implementation. Look at the pseudo code of the wiki page I linked to - that's what your code should look like.
|
|
|
|
|
What have you to say?
I guess you can't collate the code and algorithm, so I help you by this:
List<int> numbers = new List<int>();
for (int i = 2; i < 2000000; i++)
numbers.Add(i);
for (int p = 0; p < numbers.Count - 1; p++)
if (numbers[p].IsPrime)
for (int j = p + 1; j < numbers.Count - 1; j++)
if (numbers[p].IsPrime)
if (numbers[j].Value % numbers[p].Value == 0)
numbers[j].IsPrime = false;
Meysam
modified 12-Sep-12 14:43pm.
|
|
|
|
|
I understood your code perfectly. I can't help it if I'm able to understand algorithms better than you can; it's called age, wisdom and experience.
What I needed you to do is actually go and read the algorithm itself. The sieve is not brute force - your code is. I'm guessing that this is a homework assignment for you, so I'm not going to give you the code - but the pseudocode in the wikipedia article articulates the solution perfectly. Perhaps if you actually tried that algorithm rather then you'd see why I'm saying what it is.
Meysam Tolouee wrote: for (int p = 0; p < numbers.Count - 1; p++)
You don't need to go all the way through to the end of the list. You only need to go to the square root of n.
Meysam Tolouee wrote: if (numbers[j].Value % numbers[p].Value == 0)
Not needed. The sieve doesn't require this test.
|
|
|
|
|
See how point 2 is different from your implementation, and how the description of point 3 is TOTALLY different from your implementation
By way of example I mocked up 2 implementations. The first uses your code:
static void Brute(int max)
{
var numbers = new List<Number>();
for (int i = 2; i < max; i++)
numbers.Add(new Number(i));
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < numbers.Count - 1; i++)
if (numbers[i].IsPrime)
for (int j = i + 1; j < numbers.Count - 1; j++)
if (numbers[j].Value % numbers[i].Value == 0)
numbers[j].IsPrime = false;
sw.Stop();
Console.WriteLine("Brute: {0}ms",sw.ElapsedMilliseconds);
}
I reduced it to only going to 200000, as it took too long to go all the way to 20000000 for the purpose of this demo:
Result:
Brute: 152009ms
Then I mocked up a very quick Sieve implementation without the enhancements that can be made (described in the wiki article)
-- Code example removed. If this is homework, im not doing it for you.
Result:
Sieve:15ms
The proof, as they say, is in the pudding. In this case Sieve pudding is ready just a little bit quicker
|
|
|
|
|
It is not my homework.
I am solving this.[^]
Also I didn't down vote any of the post in this forum.
Meysam
|
|
|
|
|
Well I can tell you the answer (142913828922 calculated in 386ms), but you should definately try to work out the right algo yourself, its a good learning excercise.
By the way, your original code goes to 20 million, whereas the problem you're solving asks for 2 million.
|
|
|
|
|
It is not important for me to know the answer.
I want to find out the best algorithm, and you are not going to help me.
Thanks anyway.
Meysam
|
|
|
|
|
Meysam Tolouee wrote: nd you are not going to help me.
What the hell do you want him to do ? He has told you in about every possible way how you should improve your code, starting by implementing the algorithm correctly.
~RaGE();
I think words like 'destiny' are a way of trying to find order where none exists. - Christian Graus
Do not feed the troll ! - Common proverb
|
|
|
|
|
We have told you where the algorithm is. You just haven't used it. Seriously, put your preconceptions to one side and take a look at that wiki page. Read the explanation and then carefully read the algorithm presented there. Then try writing it fresh. You'll be amazed at the difference.
|
|
|
|
|
You made a big error in the algorithm as stated above. Also you add work with instantiating classes (struct probably better).
private static bool[] _numbers;
static void Main(string[] args)
{
var sw = new Stopwatch();
sw.Start();
Run();
sw.Stop();
Console.WriteLine("Milliseconds run: " + sw.ElapsedMilliseconds);
Console.WriteLine("Primes: " + _numbers.Count(i => i));
Console.ReadLine();
}
private static void Run()
{
const int count = 2000000;
_numbers = new bool[count];
for (int i = 2; i < count; i++)
_numbers[i] = true;
int baseCounter = 1;
while (baseCounter < count)
{
do
{
baseCounter++;
if (baseCounter == count) return;
} while (!_numbers[baseCounter]);
int counter = baseCounter << 1;
while (counter < count)
{
_numbers[counter] = false;
counter += baseCounter;
}
}
|
|
|
|
|
I want the sum of prime numbers not count of them!
long sum = 0;
for (int i = 0; i < _numbers.Length - 1; i++)
{
if (_numbers[i])
sum += i;
}
Thank you for your time.
Meysam
modified 12-Sep-12 17:12pm.
|
|
|
|
|
If you want the sum or primes then:
static void Main(string[] args)
{
var sw = new Stopwatch();
sw.Start();
Run();
sw.Stop();
Console.WriteLine("Milliseconds run: " + sw.ElapsedMilliseconds);
Console.WriteLine("Primes: " + _numbers.Count(i => i));
var sum = 0;
for (int i = 2; i < _numbers.Count(); i++)
if (_numbers[i]) sum += i;
Console.WriteLine("Sum of Primes: " + sum.ToString("n0"));
Console.ReadLine();
}
|
|
|
|
|
Wow. With all this talk of Project Euler #10, I had to go dig up my answer to the problem from a couple of years ago. My implementation get the answer in 71 milliseconds, but I had mine built into a class and used tristates instead of booleans.
[EDIT]
Whoops. Might help if I wrap the stop watch around the code that generates the data and not include the code the sums up all the values. And it might help if I ran the Release version instead of the Debug.
New time: 17 milliseconds
modified 12-Sep-12 18:52pm.
|
|
|
|
|
Amazing, is it not. The questioner totally screwed up the algorithm, doing it the brut force way. Obviously took forever. Did not even realize was not doing the algorithm. Mine is not even optimal, made a slight change and got down to 24 ms.
|
|
|
|
|
Yeah, some people shouldn't ask questions if they are going to deny every person giving them every correct answer.
|
|
|
|
|
This is an article about finding prime numbers using the Sieve of Eratosthenes:
Finding prime numbers[^]
It's in VB.NET, but you can download the source in C#.
|
|
|
|
|
There are references to a pure C# implementation that sovles his problem completely there as well.
|
|
|
|
|
I don't think I've ever seen it done so inefficiently.
0) You don't need to store the value; use the index.
1) You don't need to allocate space for even numbers.
2) You don't need to allocate a boolean (8-bit) just to store one bit worth of information.
3) You don't need to investigate the whole range; only investigate up to the square root (as others have already told you), then simply iterate the rest.
|
|
|
|
|
Hi All, I am looking at a tutorial on using Gridview and the Hyperlinkfield, and I have question that I'd like to have an answer to. The tutorial I'm looking at is the article Practical Guide for Creating HyperLinkField in GridView in ASP.NET. In it, the author uses a gridview to display a student's information in four columns namely UserID, UserName, FilePath, and Photo. The FilePath column is what I'm interested in, when users click on links inside of it they can download students' profiles which are stored on the web server. The links are full paths to the profiles stored on the database. How do I modify the the code so that instead of seeing the full paths of files, all the users see are their names, and on top of that still enable users to download the profiles by clicking on the file names? Thanks in advance for your help.
|
|
|
|
|
Shouldn't you be asking this on that article instead?
|
|
|
|
|
The article is quite old, I did not see any new activities lik questions being asked so I thought it wasn't active.
|
|
|
|
|
I want to get the name of the printer chosen in Acrobat PrintDialog using SendMessage Windows API.
This is sample code.
static string GetWindowText( hwnd_printDialog_in_Acrobat )
{
int comboBoxCount = 0;
int HWND_PRINTER_NAME = 1 ;
List<intptr> ChildPtrList = GetChildWindows(hwnd_printDialog_in_Acrobat);
for( i=0 ; i < ChildPtrList.Size(); i++) {
GetClassName( ChildPtrList[i], sClass, 100);
if (sClass.ToString() == "ComboBox") {
comboBoxCount++;
if (comboBoxCount == HWND_PRINTER_NAME ) {
hwnd = ChildPtrList[i];
break;
}
}
}
ChildPtrList.Clear();
int sSize ;
sSize = SendMessageW( hwnd, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero )+1;
StringBuilder sbTitle = new StringBuilder( sSize );
SendMessageW( hwn, WM_GETTEXT, (IntPtr)sSize, sbTitle);
return (sbTitle.ToString());
}
The return value of sSize is 4; The value of sbTitle.ToString() is "?-" etc.
The expected result what I want is "HP Officejet Pro .. ", for example.
What is wrong?
Thanks in advnace.
|
|
|
|
|
toBeH_S wrote: SendMessageW( hwn, WM_GETTEXT, (IntPtr)sSize, sbTitle);
You probably meant hwnd.
What is the following code doing:
StringBuilder title = new StringBuilder();
Int32 sSize = SendMessage((int)hWnd, WM_GETTEXTLENGTH, 0, 0).ToInt32();
if (sSize > 0)
{
sbTitle = new StringBuilder(sSize + 1);
SendMessage(hwnd,( int)WM_GETTEXT, sbTitle.Capacity, sbTitle);
}
return sbTitle.ToString();
There could also be a Unicode problem.
~RaGE();
I think words like 'destiny' are a way of trying to find order where none exists. - Christian Graus
Do not feed the troll ! - Common proverb
|
|
|
|