stryk3r1215
stryk3r1215

Reputation: 41

Test if numbers are divisible by 4, up to 100 digits

Simply enough, I practice programming via an online judge. This is a rather stupid problem, really easy. However, The judge keeps saying I have a wrong answer. I'm just going to paste the code which is just a few lines, and a link to the problem.

#include <iostream>
#include <string>

using namespace std;

int main() {

    int cases = 0;
    string solution = "";
    cin >> cases;

    if (cases > 100)
        return(0);

    for (int i = 0; i < cases; i++) {
        int temp = 0;
        cin >> temp;
        if ((temp % 4) == 0)
            solution +="Y";
        else
            solution +="N";
    }

    for (int j = 0; j < cases; j++) {
        if (solution[j] == 'Y')
            cout << "YES";
        else
            cout << "NO";
        cout << endl;
    }
}

The problem is simply to output YES or NO for each number that is input that is divisible by 4, YES for if it is, NO if its not. The problem and every minute detail can be found: http://coj.uci.cu/24h/problem.xhtml?abb=1306

This is rather silly, but I'm going bonkers here trying to figure out what I'm doing WRONG!

Upvotes: 0

Views: 8763

Answers (6)

dieram3
dieram3

Reputation: 591

If you express a number X as Y + d where d = X%100 and Y = X -d we can see that Y will always be divisible by 100, for example for the number X = 343535, Y would be 343500 and d would be 35. Since Y is divisible by 100, implies that is divisible by 4, so you can determinate if X is divisible by 4, checking if d is divisible by 4, i.e the last two digits of X.

Formally it would be:

Y = 4*Z

Y = 100*X +d

Y = 4*Z = 4*25*X +d

d = 4*(Z - 25*X)

i.e if Y is multiple of 4, d is multiple of 4

You have to apply this principle to solve your problem.

Simply read a raw string and check if the number represented by the last two characters are divisible by four.

Upvotes: 1

GreenFox
GreenFox

Reputation: 1

I wouldn't even read the whole number. I would just read the last 2 digits before the EOF char (end of file).

string inputString;
while(getline(cin,inputString)
{
    //code for finding x %4==0 and output
}

then all you need to do is convert the last 2 chars into a int and then do your mod 4 code. (you'll need a catch value for numbers < 10, but that shouldn't be hard)

Upvotes: 0

SigTerm
SigTerm

Reputation: 26429

A number is divisible by 4 if its two last decimal digits are divisible by 4.

The end.

P.S. Sometimes it makes sense to stop thinking as a programmer and remember algebra/arithmetics.

Upvotes: 11

mari0-k
mari0-k

Reputation: 310

Perhaps the problem is this if (cases > 100). because of this -1 would be a valid option. Change to if (cases > 100 && cases < 1) to fix it

Upvotes: 0

Marius Bancila
Marius Bancila

Reputation: 16338

As tempting as might be, you don't need a BitInteger to figure out whether a 100 digit number, of 1 million digit number is divisible by 4. That's just simple math, that you should be able to figure by yourself in a minute, if you don't know the rule.

Upvotes: 0

lukegravitt
lukegravitt

Reputation: 902

As I said in a comment, the problem is that you cannot read a 100 digit number into an int directly. I don't want to give you the solution to the algorithm, but a hint that should help: How many digits would you need to know if the number was divisible by 2 or by 5? And how could you extend that to 4?

Upvotes: 3

Related Questions