|
Thread Rules 1. This is not a "do my homework for me" thread. If you have specific questions, ask, but don't post an assignment or homework problem and expect an exact solution. 2. No recruiting for your cockamamie projects (you won't replace facebook with 3 dudes you found on the internet and $20) 3. If you can't articulate why a language is bad, don't start slinging shit about it. Just remember that nothing is worse than making CSS IE6 compatible. 4. Use [code] tags to format code blocks. |
On July 15 2010 21:35 Cloud wrote:Hey, could someone help me with problem 10? (find the sum of all primes below two million). My code works just fine for small numbers but when it goes above a certain number it just displays a bunch of crap. I wanna know if I'm declaring my types wrong or if there's something else wrong. + Show Spoiler +The function primo checks if it's a prime. If it's a prime it returns a 1 and the main function sums it to 17 (I skip 2, 3, 5 and 7). All prime numbers apart from 2 and 3 are of the form 6*i +/- 1, and to check if it's a prime you don't need to go above the sqrt of the number. #include <stdio.h> #include <math.h>
#define MAX 2000000
int primo(int);
int main(void) { int i; long int suma = 17; for (i= 2; i * 6 + 1 < MAX; i++) { if (primo((i * 6) + 1) == 1) suma += ((i * 6) + 1); } for (i = 2; i * 6 - 1 < MAX; i++) { if (primo((i * 6) - 1) == 1) suma += ((i * 6) - 1); } printf("%d", suma); return 0; }
int primo(int num) { int i; float j; if (num % 2 == 0) return 0; if (num % 3 == 0) return 0; j = sqrt(num); for (i = 1; i * 6 + 1 <= j; i++) { if (num % (i * 6 + 1) == 0) return 0; } for (i = 1; i * 6 - 1 <= j; i++) { if (num % (i * 6 - 1) == 0) return 0; } return 1; }
Your algorithm is correct and fast enough. The problem is that the sum of all primes < 2000000 does NOT fit in a C long int (which in reality is the same 32-bit size as a regular int*). You get garbage because you overflow. Use the 64-bit integer type long long (in gcc, in VC++ it's probably called something else, use google). After you do that, you have to change the format string of printf to say that you're printing a long long (in gcc, its "%lld" (two el's)).
*This is because in the olden days of 16-bit processors (when C was created), the type "int" was meant to be the standard word size of the processor. "long" is guaranteed to be at least 32 bits. When 32-bit processors got popular, the C99 standard added "long long", which guarantees 64-bits.
|
I just modified an old C++ version of the Sieve of Eratosthenes to do #10 and it ran in about 50ms. It's ugly, way too long, hard to understand, and largely uncommented but I don't feel like rewriting it at the moment. Maybe later. Main reason for ugliness: I didn't understand creating dynamic arrays at the time and just settled for making array chunks 500,000 big which created a huge amount of unnecessary complication. Kinda fun to look at old projects and see how far you've come.
+ Show Spoiler + #include <fstream> #include <math.h> #include "StopWatch.h"
using namespace std;
const long TOTAL_NUMS = 2000000; const int INITIALPRIMES_SIZE = 1415; // INITIALPRIMES_SIZE = sqrt( TOTAL_NUMS ) const long SIEVECHUNK_SIZE = 500000; // arbitrary but anything much bigger crashes long long primesTotal; long primeCount;
void FillSievePrimes( int sievePrimes[], long totalNums ); void InitialSieve( bool initialPrimes[], int sieveNum, int sieveMax ); void InitializeTestPrimes( bool testPrimes[], int duplicateCount ); void SieveChunk( int chunkNumber, bool testPrimes[], int sievePrimes[] ); void NormalSieve( bool testPrimes[], long sieveNum, long sieveMin, long sieveMax ); void OutputResults( double elapsedTime );
void main() { bool testPrimes[SIEVECHUNK_SIZE]; int sievePrimes[INITIALPRIMES_SIZE / 2]; StopWatch stopWatch;
stopWatch.StartTimer();
// fill sievePrimes with the primes up to sqrt( 2,000,000 ) to be used for the rest of the sieves FillSievePrimes( sievePrimes, TOTAL_NUMS );
// prepare the testPrimes array for use InitializeTestPrimes( testPrimes, INITIALPRIMES_SIZE );
// for each of 4 chunks of 500,000 numbers, use the sievePrimes to determine the primes in that chunk for( int chunkNumber = 0; chunkNumber < 4; chunkNumber++ ) SieveChunk( chunkNumber, testPrimes, sievePrimes );
stopWatch.StopTimer();
OutputResults( stopWatch.GetElapsedTime() ); }
void FillSievePrimes( int sievePrimes[], long totalNums ) { bool initialPrimes[INITIALPRIMES_SIZE]; int sieveNum = 2; int max = int( sqrt( sqrt( float( totalNums ) ) ) ) + 1; // max = 38
primeCount = 0;
for( int i = 0; i < INITIALPRIMES_SIZE; i++ ) initialPrimes[i] = true;
while( sieveNum < max ) { sievePrimes[primeCount] = sieveNum; primeCount++; primesTotal += sieveNum; InitialSieve( initialPrimes, sieveNum, INITIALPRIMES_SIZE ); sieveNum++; while( initialPrimes[sieveNum] == false ) sieveNum++; } for( int i = sieveNum; i < INITIALPRIMES_SIZE; i++ ) if( initialPrimes[i] == true ) { sievePrimes[primeCount] = i; primeCount++; primesTotal += i; } sievePrimes[primeCount] = totalNums; }
void InitialSieve( bool initialPrimes[], int sieveNum, int sieveMax ) { int currentNum = sieveNum * sieveNum;
while( currentNum < sieveMax ) { initialPrimes[currentNum] = false; currentNum += sieveNum; } }
void InitializeTestPrimes( bool testPrimes[], int duplicateCount ) { // set all to true initially for( int i = 0; i < SIEVECHUNK_SIZE; i++ ) testPrimes[i] = true;
// prevent duplicate prime counting since FillSievePrimes already counted primes up to INITIALPRIMES_SIZE for( int i = 0; i < duplicateCount; i++ ) testPrimes[i] = false; }
void SieveChunk( int chunkNumber, bool testPrimes[], int sievePrimes[] ) { long sieveIndex = 0; long sieveNum = sievePrimes[sieveIndex]; long sieveChunkMin = SIEVECHUNK_SIZE * chunkNumber; long sieveChunkMax = SIEVECHUNK_SIZE * ( chunkNumber + 1 ); int max = int( sqrt( float( sieveChunkMax ) ) );
testPrimes[0] = false;
while( sieveNum < max ) { NormalSieve( testPrimes, sieveNum, sieveChunkMin, sieveChunkMax ); sieveIndex++; sieveNum = sievePrimes[sieveIndex]; }
for( long i = 1; i < SIEVECHUNK_SIZE; i+=2 ) { if( testPrimes[i] == true ) { primeCount++; primesTotal += i + sieveChunkMin; } else testPrimes[i] = true; } }
void NormalSieve( bool testPrimes[], long sieveNum, long sieveMin, long sieveMax ) { long currentNum = sieveNum * sieveNum;
if( currentNum < sieveMin ) currentNum = sieveMin + sieveNum - ( sieveMin % sieveNum );
while( currentNum < sieveMax ) { if( currentNum > sieveMin ) testPrimes[currentNum - sieveMin] = false; currentNum += sieveNum; } }
void OutputResults( double elapsedTime ) { ofstream outputFileStream;
outputFileStream.open( "output.txt", ios::out ); outputFileStream << "Total of primes up to 2,000,000: " << primesTotal << endl << endl << "Elapsed time: " << elapsedTime << endl; outputFileStream.close(); }
|
On July 15 2010 06:48 terr0r wrote:Show nested quote +On July 15 2010 05:31 alexpnd wrote: I want to get more into Python well because, it's a bw map... LMFAO! I've been developing for the web for a while now (10 years?). If you're looking to get into the back-end stuff I'd still recommend PHP as a starting point right now. I feel that languages like Python and Ruby are poised to take the crown of most commonly used language from PHP eventually, but right now it is the most widely supported, documented and easiest to get started with. Most web hosts run PHP by default so you can find them cheaply. Python (using Django) is done nicely but has a host of small issues in terms of support. You will likely have to have your host make some adjustments in order for you to get it running, if at all. Ruby (via Rails) has more support but as previously mentioned the current implementation is resource hungry and has scalability issues related to that. I like Django over Rails personally though I like Rails Active Record over Django's ORM (Datbase handling layer). PHP has a slew of widely used frameworks though my hands down favorite is Code Igniter (http://codeigniter.com/). Another problem with learning Djano is that there are not a lot of tutorial/screencasts relevant to the current version. A lot of their screencasts are outdated and I like watching screenies to get a quick overview of how the Framework works. Frameworks are invaluable assets for a Web Developer as they handle a lot of the lower-level business logic that you will use from site to site (RSS Feeds, Administrative interfaces, Session handling, Caching, etc.). I don't think PHP is the best language out there right now, but it is the best STARTER language currently.
I'm surprised you didn't drop a line for C# & asp.net as something for a beginner! As far as intranet web apps go, if it's not a quick and dirty Rails, py/pl CGI, it's likely some C# & asp.net magic :-) The framework that .net provides is pretty simple to work with relative to the scripting languages' frameworks.
On another note, directed at tofucake: I also attend Drexel! I'm in their BSIT program. However, I'm taking the CS courses necessary to begin the MS Software Engineering program that they offer soon after I graduate. I'm curious: what's your opinion of Captain Schmidt's labs? 
Also, some very interesting links to add to your (tofucake's) OP, if you think they'd be valuable...
On programming language design in general. Has many links to documents open to the public that various Universities provide along with a wealth of other info. http://lambda-the-ultimate.org/
On various topics regarding Python, Swig, PLY, extending Python, Python's GIL (old and upcoming), and others. The coroutines presentation and code snippets are pretty awesome, but you'd need to understand Python's generator objects before reading. http://www.dabeaz.com/talks.html
And one important set of (incomplete) books that I think you may've forgotten! Don Knuth's The Art Of Computer Programming: http://www.amazon.com/Art-Computer-Programming-Volumes-Boxed/dp/0201485419
And a blog containing many mini-guides and gems of knowledge on many topics, though it's mostly focused on Python and web programming (I believe with Django): http://www.saltycrane.com/blog/
Sorry in advance if this appears to crash another thread of discussion going on! This forum topic just caught my eye.
|
Thanks to everyone who helped! Appreciate it.
|
There's been a couple of mentions in the thread, but are there many people here who do competitive programming (eg TopCoder, ACM ICPC, Google Code Jam)?
I've been doing these when they come up for quite a while, just wondering because it seems like a natural thing for people in a competitive community like teamliquid to be interested in.
|
Speaking of competition coding, does anyone remember CodeRuler?
God that thing was fun.
|
On July 16 2010 11:58 Yukidasu wrote: There's been a couple of mentions in the thread, but are there many people here who do competitive programming (eg TopCoder, ACM ICPC, Google Code Jam)?
I've been doing these when they come up for quite a while, just wondering because it seems like a natural thing for people in a competitive community like teamliquid to be interested in. I was doing the ACM ICPC the past few years. 2 years ago my team placed 3rd in the mideast region, which was unfortunately 1 off getting to go to China. Ah well. Anyway, our coach moved to Seattle, so that pretty ended my participation in that competition.
|
On July 16 2010 11:58 Yukidasu wrote: There's been a couple of mentions in the thread, but are there many people here who do competitive programming (eg TopCoder, ACM ICPC, Google Code Jam)?
I've been doing these when they come up for quite a while, just wondering because it seems like a natural thing for people in a competitive community like teamliquid to be interested in.
I did GCJ this year and last year but probably won't do it anymore
|
I do GCJ too, and I've been doing TopCoder for a long time, but I'm only mediocre at it; my peak rating is 1600ish. It blows my mind that people can complete the 1000-pointers in an hour fifteen -- once in a while I can start to solve it in the time allotted, but usually I have the wrong approach in mind anyway. The top red coders are like what is this I don't even.
(It doesn't help that they only use C# 2.0, which is a really shitty language compared to 3.0, and I don't know the STL or the Java libraries well enough to be competitive, so I feel like I'm crippled language-wise. I end up in situations where I have a problem worked out but I just can't actually type it in time.)
|
Yeah, I think it's really important to be using C++ for topcoder, you get quite a significant speed bonus and the questions are usually written for it. I just use C++. (I'm around 2000 on TopCoder at the moment.)
The top guys are pretty scary!
|
I'm on Topcoder too...I'll let the rating graph tell you how inconsistent I am.
|
Hey, I am curious, you call this The Big Programming Thread however I cannot believe you do not include ActionScript 2.0/3.0, it is a legitimate language and is used for all flash games and flash websites.
Anyway it was just a thought that maybe you could add in ActionScript. Oh well it was just a suggestion 
~WarChimp
|
Just finished my first year of CS, and damn was that easy. Taught myself Java/C++/PHP/Haskell without going to any lectures wow fun. Ive been programming in python/lua for the past 3 years and love OOP style. Wonder what fun the next 2 years will bring.
|
First two years are pretty boring, imo. You get a taste your 4th sem, but don't really cover anything before 5th and onward.
|
Actionscript is a language, but personally, i could never put it in the same list with all C variants, maybe even java, and the such.
|
Canada9720 Posts
actionscript is awful. anyone with experience with flex 3 / 4 will attest to how bug-ridden and non-sensical the whole "platform" is. the compiler is awful, the language submits to archaic runtime constraints from the flash player, and they managed to break functionality in the "enterprise" flash builder that worked just fine in good old fashioned eclipse. but at least your programs will look pretty, right?
on to bashing another language: you c++ lovers will enjoy these:
linus hating on c++: http://lwn.net/Articles/249460/ zed shaw hating on c++: http://librelist.com/browser//mongrel2/2010/7/15/c-verses-c /#770d94bcfc6ddf1d8510199996b607dd
|
we should have some Scheme in this thread, i hate it in the begining but after 4 months learning/using it, Scheme is THE SHIT!
|
Actionscript is just plain awful, made worse by their crappy libraries. I used to use it for browser games until JOGL came out, and now I have full hardware acceleration on the browser with a high performance VM. (Actionscript was way too slow)
On July 16 2010 09:27 SoLaR[i.C] wrote: Anybody have a suggestion for a FORTRAN compiler?
GFORTRAN
http://gcc.gnu.org/fortran/
IMO anything from the GCC collection is very good quality, and free!
On July 16 2010 23:08 CTStalker wrote:actionscript is awful. anyone with experience with flex 3 / 4 will attest to how bug-ridden and non-sensical the whole "platform" is. the compiler is awful, the language submits to archaic runtime constraints from the flash player, and they managed to break functionality in the "enterprise" flash builder that worked just fine in good old fashioned eclipse. but at least your programs will look pretty, right? on to bashing another language: you c++ lovers will enjoy these: linus hating on c++: http://lwn.net/Articles/249460/zed shaw hating on c++: http://librelist.com/browser//mongrel2/2010/7/15/c-verses-c /#770d94bcfc6ddf1d8510199996b607dd
LOL Zed!
http://artlung.com/smorgasborg/Invention_of_Cplusplus.shtml
Re-up, just to add to the C++ bashing bandwagon :D. (IMO the worst designed language of all time, repeated inheritance ftl)
On July 16 2010 07:49 UdderChaos wrote: lol VB isn't a real language, it's like the mac of the programming languages.
Well BASIC is a real language, and VB has just as much functionality and performance as that of most structured programming languages. There's a lot of undocumented features though, like dynamic memory allocation.
If you want to see VB reaching almost compiled C++ speeds have a look here.
http://www.xbeat.net/vbspeed/
That said, I really dislike VB in comparison to Pascal or C.
On July 13 2010 13:54 catamorphist wrote: I'm not sure -- I just don't think that you can look at a class and treat it as a method list and nothing else. To start with, those methods all have names; surely you agree that the names are important? Suppose Array.BinarySearch always returned the right result, but it only did it in linear time; wouldn't you be surprised and irritated that it wasn't logarithmic?
How do you know whether a piece of data ought to be exposed as a property or a method call in C#? Usually, the convention is that if it could take a non-negligible amount of time to get the result, it ought to be a method call (barring some lazy initialization sort of hijinx.) So here is already an example where C# suggests different best practices based on the performance of your implementation.
Most C# programmers who are collaborating with other people are vaguely familiar with most of the framework classes that implement IList and ISet, so it's not a matter of looking at all the concrete classes; you've already seen them. I think that real efficiency is being able to quickly gauge a big piece of code based on the shared experience and conventions between you and the writer, maximizing the amount of information you're communicating with your choices of design, variable names, and types. I don't see any reason that performance characteristics shouldn't be part of that information.
You can, its called documentation. If you follow the best practises of OOP and conventions of the language, there will be no ambiguity and you won't even need to think to make ridiculously trivial decisions like deciding whether to use properties or accessor/modifiers.
"Real efficiency" stems from maintainable code, achieved by following the best practises of OOP. 41% of maintenance costs are derived from changes in User Requirements, 4% on efficiency improvements. This has a lot to do with the reason that OOP doesn't care for performance, and that most good programmers know that early optimisation is the root of all evil in programming. Scaling hardware is cheap.
The whole gauging a big piece of code is the most incorrect way to look at (and write) code. Programming is about making abstractions, breaking the logic down over and over, through functional decomposition and object decomposition. This allows you and other programmers to focus on as little tasks as possible, one at a time, the less you have to think about, the faster you can make changes. You won't always have the luxury of communicating with the designers of the code, which is why you document your code and make it as simple to understand as possible.
By choosing a concrete class over an interface based on performance, you are making the assumption that other programmers knowing the performance of the code is absolutely necessary, and you are prepared to potentially skyrocket maintenance costs just because of that. You are also sacrificing potential performance improvements in the future.
I couldn't care less how Array.BinarySearch performed. If it's too slow, it has nothing to do with the search algorithm, it means you have done something stupid. Maybe if I were creating database engine from the ground up I would care, but then I wouldn't be using C# and most likely be using a procedural language like C.
|
On July 16 2010 23:11 NB wrote: we should have some Scheme in this thread, i hate it in the begining but after 4 months learning/using it, Scheme is THE SHIT!
Scheme is totally THE SHIT! Functional programming was my favorite undergrad class and I love when I have a reason to code up a Scheme script for GIMP!
Oh, I vote for putting Action Script on the list. I've recently been helping my college buddy who went English major --> web producer --> web developer --> programmer (AS3), tada! Any language that brings in completely new programmers is fine by me.
|
On July 16 2010 11:58 Yukidasu wrote: There's been a couple of mentions in the thread, but are there many people here who do competitive programming (eg TopCoder, ACM ICPC, Google Code Jam)?
I've been doing these when they come up for quite a while, just wondering because it seems like a natural thing for people in a competitive community like teamliquid to be interested in.
i went to the south european icpc finals, but my team didn't manage to solve a single problem. was quite embarrasing. ^^
|
|
|
|