Solution to the ACM Programming Problem 1
So the other day month, I posted a programming problem from the ACM inter-collegiate programming competition that I did last year. Here’s my plain-English solution (with some code too). And yes. It is three months late.
Well, there were a large number of people who solved the problem in virtually no time (including a solution in Factor, which I’d never heard of), showing me just how bad I am at these things. Not only that, but they solved it using methods and shortcuts I’d never even dreamed of. My solution was a simple bruteforce, and it goes a little something like this:
“UpperBound(n)” here means every number (up to an including n) added together. q is the answer of the sum, that is, the input.
- Get q.
- Start n=1. Discard as UpperBound(n)<q.
- n=2. Discard as UpperBound(n)<q.
- n=3,4, discard as UpperBound(n)<q.
- n=5, discard as UpperBound(n) and q are not both divisible by 2.
- n=6, discard as UpperBound(n) and q are not both divisible by 2.
- n=7, UpperBound(n) and q are both divisible by 2, an answer exists. Print n, end.
Didn’t make sense to you? That’s okay! I copied that verbatim from my whiteboard. Here’s some (C/C++) code, instead.
#include <iostream>
int getUpperBound(int n){
int upperBound = 0;
while (n > 0){
upperBound += n;
n--;
}
return upperBound;
}
bool getN(int q, int n){
if (getUpperBound(n) < q) {
return false;
} else {
//check for divisibility (if q/2 then upperbound of n _must_ also be /2
if (((getUpperBound(n)%2==0) && (q%2==0)) || (!(getUpperBound(n)%2==0) && !(q%2==0))) {
return true;
} else {
return false;
}
}
}
//get q elsewhere, like a text file
int main (int q) {
q = 12;
if (q < 0){
//should use absolute value here instead, not that it makes a difference
q+=(0-q)*2;
}
int i = 1;
while((getN(q, ++i)) != true); //prefix used so there's no off-by-one error
std::cout << i << std::endl;
}
That code ought to compile in the majority of popular C/C++ compilers – I wrote it in XCode and compiled with GCC. However, the input doesn’t conform to the competition’s typical text-file input standards – in fact, there is no input. To check the algorithm with another number, just change q in the main method.
My apologies for the three months of delaying – although I’m sure nobody waited that long for the (probably inefficient, insufficiently-explained) answer.



good job! I will go through it!