And / or in java - java

im having a problem in my java exercice
the question is saying
The program will end when the sum of even is >= 50 or the sum of odd is >= 49.
so while solving it i tried to use
while (sumeven < 50 || sumodd < 49 )
and it didnt worked at all but when i checked the solution they use
while (evensum <= 50 && oddsum<=49)
and it worked ( gave same answeres like the sample run)
so my question is did i misunderstood it ? or the question have some kind of a wrong given. thank you for your time
update:
the code :
package sample2;
import java.util.Scanner;
public class Sample2 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("enter the initial value");
int sumeven=0;
int sumodd=0;
int num;
int initial;
int div5and2=0;
initial=scan.nextInt();
if (initial<=0)
System.out.println("the number must be strictly positive");
else{
if (initial%2==0)
sumeven=initial;
else
sumodd=initial;
System.out.println("start entering your numbers");
num=scan.nextInt();
if (num<=0)
System.out.println("the number must be strictly positive");
else{
while(sumeven<=50||sumodd<=49 )
{
if (num%2==0)
sumeven=sumeven+num;
else
sumodd=sumodd+num;
if (num%5==0 &&num%2==0)
div5and2=div5and2+1;
num=scan.nextInt();
while(num<=0)
{
System.out.println("the number must be strictly positive");
num=scan.nextInt();
}
}
System.out.println("the sum of even numbers: "+sumeven);
System.out.println("the sum of odd numbers: "+sumodd);
System.out.println("the number of integers divided by 2 and 5: "+div5and2);
}
}
}
}

This is basic boolean algebra.
The 'opposite' of or is and, so if you want to stop when
"even >= 50 or odd >= 49"
you have to continue on the opposite, which is
"even < 50 and odd < 49".

while(sumeven<50||sumodd<49 ) means the program will run when sumeven<50 or sumodd<49, which means it will exit when sumeven>=50 and sumodd>=49.

When you negate a statement, >= becomes < and <= becomes >. Similarly, AND becomes OR and OR becomes AND. Here, your stopping condition is even >= 50 OR odd >= 49, the negation of this (which is what is required to continue) is even<50 AND odd<49.

You want the program to end when " the sum of even is >= 50 or the sum of odd is >= 49."
So, need something like (in psuedo code):
while (Not( the sum of even is >= 50 or the sum of odd is >= 49))
De Morgan's laws tell us we need to not each part to remove the brackets and switch between and and or:
while (Not( the sum of even is >= 50) and Not( or the sum of odd is >= 49))
Let's try some examples.
If the even sum is 50 and the odd sum is 40, you want to stop.
If you check
while (sumeven < 50 || sumodd < 49 )
you will keep going since sumeven < 50 is false, but sumodd < 49 is true.
Checking both parts:
while (evensum <= 50 && oddsum<=49)
works.

while(sumeven<50||sumodd<49 )
In this case, the program did not end if sumeven<50 OR sumodd<49. That is, the program will end when sumeven>=50 AND sumodd>=50.

Boolean logic 101:
!(A || B) == !A && !B note the &&.
Essentially if you are looking at a state where either A or B and want to take the compliment of that you must code it as not either A or B which is obviously neither A nor B or not A and not B.

AIM - The program will end when the sum of even is >= 50 or the sum of odd is >= 49.
Therefore, while (sumeven < 50 || sumodd < 49 ) won't work as the program will end when the sum of even is < 50 or the sum of odd is < 49 which is not the expected behavior.
Therefore, we must loop till
The sum of even is less than or equal to 50
The sum of odd is less than or equal to 49
The overall set of conditions should only be true if all conditions are true therefore we use && operator with the 2 conditions.

Related

Print a number from 0 to inputted number that divisible by 3 or end with 3

There's one hidden test case that this code doesn't work and I don't know why. [EDITED] Sorry for the lack of information. I'm using an app to learn Java and this is a coding test, there are 4 total test with 4 different inputs, the first 3 one is fine but the last one (hidden so I don't know the input and output) told me that it's wrong but I don't know what's wrong in my code
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
int number = read.nextInt();
int x = 3;
while(number > 3 && x <= number)
{
if(x%3==0 || x%10==3)
{
System.out.println(x);
}
++x;
}
}
}
If number = 3, your while loop does not run, and since 3 is divisible by 3 it should be printed.
You can just remove that part from your while loop, and leave this.
while(x <= number)
In your code you just ignoring when the number is 3. Your condition number > 3 is ignoring when the number == 3.
DO like this while(number >= 3 && x <= number) instead of while(number > 3 && x <= number)
while(number >= 3 && x <= number)
{
if(x%3==0 || x%10==3)
{
System.out.println(x);
}
++x;
}
One thing is x>3 condition is wrong as x==3 is also true.
Other thing is, why would you use an extra condition and increase complexity when you can just do a simple for loop/ while loop from 0-number and check if number %3 or number%10 is true?

I think my code is correct but I keep getting zero?

Output that I want: 10 20 30 40 50..............
Output that I get: 0
public class HelloWorld
{
public static void main(String[] args)
{
final int n = 50;
int i= 0;
while(i <= n && i % 10 == 0 )
{
System.out.println(i);
i++;
}
}
}
while(i <= n && i % 10 == 0 )
This is the continuation condition which is two expressions connected by logical-and &&.
That means both must be true for the whole thing to be true.
Now work out the two sub-expressions for when i becomes 1. The first will be true but not so the second (1 is not a multiple of 10), meaning the loop will exit at that point. That explains why you're only seeing 0.
To fix it, you need to separate the two sub-expressions since the loop control depends only on the first. However, you still only want printing to happen for multiples of ten (the second).
So, assuming as per your desired output 10 20 30 40 50, you don't want 0 as one of the outputs (despite it being, after all, a multiple of 10), the following pseudo-code will do the trick:
set n to 50, i to 1
while i is less than or equal to n:
if the remainder when i is divided by 10 is 0:
output i
increment i
If you do want 0 included in the output, simply set i to 0 initially, and you'll see 0 10 20 30 40 50.
I've left the code above as pseudo-code on the assumption this is classwork of some description - it should be relatively easy to turn that into any procedural language.
i % 10 == 0
This will evaluate to false on the second loop so the while wont continue. I think you want this...
final int n = 50;
int i= 0;
while(i <= n)
{
if (i % 10 == 0) {
System.out.println(i);
}
i++;
}
This allows i to increment all the way up to n, but it will only print results when i % 10 == 0
You are trying to use the while and both a while and an if. Try
public class HelloWorld {
public static void main(String[] args) {
final int n = 50;
int i = 0;
while (i <= n) {
if (i % 10 == 0) {
System.out.println(i);
}
i++;
}
}
}
Loop run for once only for i=0. That's it.

java while loop won't print the text after a the stopping condition [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I just started studying Java and I'm required to use while to decided how many players can be goalkeepers based on their number. The loop is supposed to stop after the user entered 0 and print the counted number of players that can be goalkeepers.
public class Q3_201303719 {
public static void main(String[] args) {
Scanner input = new Scanner (System.in);
int num; int count=0;
System.out.println("Enter the players' numbers");
num = input.nextInt();
while ((num != 0) && (num < 31) && (num%2==0) || (num%3==0))
count++;
System.out.println(count+ " players can be goalkeepers.\n");
// Above line should be printed once the user enter 0, but in my case it won't
// print and keeps asking the user to enter a number.
}
}
From the question it is difficult to understand what it is you are trying to achieve. However, we can try to help you understand the code as it is written.
The while loop is currently written as:
while ((num != 0) && (num < 31) && (num%2==0) || (num%3==0))
This could be rewritten as the following and it would not make any difference:
while (num != 0 && num < 31 && num%2==0 || num%3==0)
The additional parenthesis that you included are not required.
In Java the operator precedence is && before ||. This means that the && operators will be evaluated first, followed by the ||. Therefore, the above statement could therefore be rewritten as the following and it would not make any difference:
while ((num != 0 && num < 31 && num%2==0) || num%3==0)
However, it may make the code a little easier to understand.
So when the code executes the following occurs:
The count variable is initialised to 0.
A value is retrieved and stored in the variable num. Lets say that this value is 10.
The while statement is evaluated for the first time:
num != 0 is true as 10 != 0.
num < 31 is true as 10 is less than 31.
num%2==0 is true as 10 divided by 2 is 5 and leaves a remainder of 0.
As these all evaluate to true, the OR part (num%3==0) is not evaluated as it is not neccessary. See short circuit evaluation (http://users.drew.edu/bburd/JavaForDummies4/ShortCircuitEval.pdf).
The count is incremented to 1.
The loop executes again for the second time. num is still 10.
num != 0 is true as 10 != 0.
num < 31 is true as 10 is less than 31.
num%2==0 is true as 10 divided by 2 is 5 and leaves a remainder of 0.
The count is incremented to 2.
And so on... in an infinite loop.
If the variable num was instead set to 9. The loop would evaluate as follows:
num != 0 is true as 9 != 0.
num < 31 is true as 9 is less than 31.
num%2==0 is false as 9 divided by 2 is 4 and leaves a remainder of 1.
Therefore, now the || part is evaluted:
num%3==0 is true as 9 divided by 3 is 3 and leaves a remainder of 0.
Again, this would result in an infinite loop.
If the variable num was instead 0:
num != 0 is false
As the first num!=0 is false, the num<31 and num%2==0 parts are not evaluated as their results would not make any difference.
The num%3==0 is then evaluated:
num%3==0 is true as 0 divided by 3 leaves a remainder of 0.
Again, this would result in an infinite loop.
I hope that this may help to clarify your understanding and allow you to correct the code appropriately.
how many players' numbers do you have to input?
you have a while loop that depends on num value, but you never change the num value. that will end up in endless loop...
if you have more players, create a for loop to enter the numbers, store the numbers in an array or an arraylist and if you use the while loop, use it so that it depends on a value that you change inside the loop. otherwise it will loop forever.
do{
System.out.println("Enter the players' numbers");
num = input.nextInt();
count++;
}while(num!=0);
your code with this should look like this:
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num;
int count = 0;
do {
System.out.println("Enter the players' numbers");
num = input.nextInt();
count++;
} while (num != 0);
System.out.println(count + " players can be goalkeepers.\n");
// Above line should be printed once the user enter 0, but in my case it
// won't
// print and keeps asking the user to enter a number.
}
If you can't use a do-while-loop as Ubica suggested, then you need to work your way around it:
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num=2; // you need to initialize num with a value, that allows you to go inside the while loop at least once
int count = 0;
while((num != 0) && (num < 31) && (num % 2 == 0) || (num % 3 == 0)) {
System.out.println("Enter the players' numbers");
num = input.nextInt(); // user input is here inside the loop
count++; // your count will count every valid input + the user input that ends the loop
}
count--; // if your user entered 0 to exit the loop, count would have still incremented, so you need do subtract one again
System.out.println(count + " players can be goalkeepers.\n");
}
As I commented in the code, first you initialize num with a dummy value, that allows you to enter the loop at least once. Then you listen to the users input and count the loop iterations. But since the loop will execute at least once (even though your user might enter 0 right away to exit the loop) your count would be one higher than the actual number of valid inputs. So you have to subtract that 1 from your count again.
EDIT
I forgot to mention: your loop will not stop when the user enters 0 because
(num % 3 == 0) // is true with num=0
so when the user enters 0 the while condition will evaluate like this:
while( false && true && true || true )
while( false || true )
while( true )
The bracketing for the loop should fix this problem.
You need braces surrounding your while loop block. As a general rule, it is best to overuse braces rather than under-use them.
Your code should look like:
package q3_201303719;
import java.util.Scanner;
public class Q3_201303719 {
public static void main(String[] args) {
Scanner input = new Scanner (System.in);
int num; int count=0;
System.out.println("Enter the players' numbers");
num = input.nextInt();
while((num != 0) && (num < 31)&& (num%2==0)|| (num%3==0)) {
count++;
}
// The braces added above are required for the while loop and will keep your program
// from not outputting your results.
System.out.println(count+ " players can be goalkeepers.\n");
}
}
Best of luck and happy coding. :)
Your code isn't making sense.
1st : The While loop is not modifying the "num" value, resulting in
infinite loop if entered.
2nd : What is the code supposed to do? It is really hard to tell from what you show.
I think placing while loop upper could help you, but still code makes no much sense
public class Q3_201303719 {
public static void main(String[] args) {
int num = 0; int count=0;
while((num != 0) && (num < 31)&& (num%2==0)|| (num%3==0)) {
Scanner input = new Scanner (System.in);
System.out.println("Enter the players' numbers");
num = input.nextInt();
count++;
}
System.out.println(count+ " players can be goalkeepers.\n");
// Above line should be printed once the user enter 0, but in my case it won't
// print and keeps asking the user to enter a number.
}
}
Edit :
This problem occurred because you didn't follow a really simple rule : think before coding.
For this exercise you need to think about what your code should be doing, and then write the code for it. Coding is just a language, if you know what you want to write then it is easier. Here you obviously don't really know what you wanna do, and as you are new with development it was likely that you get stucked

java program outputting even/odd numbers

My task is to write a java program that first asks the user how many numbers will be inputted, then outputs how many odd and even numbers that were entered. It is restricted to ints 0-100. My question is: What am I missing in my code?
import java.util.Scanner;
public class Clancy_Lab_06_03 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n;
System.out.println("How many numbers will be entered?");
n = input.nextInt();
while (n < 0 || n > 100) {
System.out.println("ERROR! Valid range 0-100. RE-Enter:");
n = input.nextInt();
n++;
}
int odd = 0;
int even = 0;
while (n >= 0 || n <= 100) {
n = input.nextInt();
if (n % 2 == 0) {
even++;
} else {
odd++;
}
}
System.out.println(even + "even" + odd + "odd");
}
}
Second while loop is infinite. Relplace it with something like this:
for (int i = 0; i < n; i++) {
int b = input.nextInt();
if (b % 2 == 0) {
even++;
} else {
odd++;
}
}
Also I don't understand why are you incrementing n in first loop. For example when you will first give -5, you will be asked to re-enter the number. Then you type -1, but it gets incremented and in fact program processes 0, altough user typed -1. In my opinion it is not how it suppose to work and you should just remove this n++.
As you asked in comment - the same using while loop:
while(n > 0) {
n--;
int b = input.nextInt();
if (b % 2 == 0) {
even++;
} else {
odd++;
}
}
Also it is good idea to close input when you no longer need it (for example at the end of main method)
input.close();
You had two issues - first you were incrementing n in the first loop, rather than waiting for the user to enter a valid number.
In the second loop, you weren't comparing the number of entries the user WANTED to make with the number they HAD made - you were over-writing the former with the new number.
This version should work, although I've not tested it as I don't have java on this machine.
Note that we now sit and wait for both inputs, and use different variable names for the "how many numbers will you enter" (n) and "what is the next number you wish to enter" (num) variables? Along with a new variable i to keep track of how many numbers the user has entered.
import java.util.Scanner;
public class Clancy_Lab_06_03
{
public static void main (String[] args)
{
Scanner input = new Scanner (System.in);
int n;
System.out.println ("How many numbers will be entered?");
n = input.nextInt();
//Wait for a valid input
while (n < 0 || n > 100)
{
System.out.println ("ERROR! Valid range 0-100. RE-Enter:");
n = input.nextInt();
}
//Setup variables for the loop
int odd = 0;
int even = 0;
int num;
//Keep counting up until we hit n (where n is the number of entries the user just said they want to make)
for(int i = 0; i < n; i++)
{
//Changed this, because you were over-writing n (remember, n is the number of entries the user wants to make)
//Get a new input
while (num < 0 || num > 100)
{
System.out.println ("ERROR! Valid range 0-100. RE-Enter:");
num = input.nextInt();
}
//Check whether the user's input is even or odd
if (num % 2 == 0)
{
even++;
}
else
{
odd++;
}
}
System.out.println(even + " even. " + odd + " odd.");
}
}
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
System.out.println("Enter an Integer number:");
Scanner input = new Scanner(System.in);
int num = input.nextInt();
if ( num % 2 == 0 )
System.out.println("Entered number is even");
else
System.out.println("Entered number is odd");
}
}
My suggestion to you is to have a clear separation of your requirements. From your post, you indicate you need to prompt the user for two distinct data items:
How many numbers will be entered (count)
The values to be analyzed
It is a good practice, especially when you are learning, to use meaningful names for your variables. You are using 'n' for a variable name, then reusing it for different purposes during execution. For you, it is obvious it was difficult to figure out what was 'n' at a particular part of the program.
Scanner input = new Scanner (System.in);
int count;
System.out.println ("How many numbers will be entered?");
count = input.nextInt();
//Wait for a valid input
while (count < 1 || count > 100)
{
System.out.println ("ERROR! Valid range 1-100. RE-Enter:");
count = input.nextInt();
}
Additionally, a count of zero should not be valid. It does not make sense to run a program to evaluate zero values (don't bother a program that does nothing). I believe the lowest count should be one instead.
int odd = 0;
int even = 0;
int value;
do
{
System.out.print("Enter a number between 0 and 100: ");
value = input.nextInt();
while (value < 0 || value > 100)
{
System.out.println ("ERROR! Valid range 0-100. RE-Enter:");
value = input.nextInt();
}
if (value % 2 == 0)
{
even++;
}
else
{
odd++;
}
count--; // decrement count to escape loop
} while (count > 0);
System.out.println(even + " even. " + odd + " odd.");
This example uses a do/while loop because in this case, it is OK to enter the loop at least once. This is because you do not allow the user to enter an invalid number of iterations in the first part of the program. I use that count variable directly for loop control (by decrementing its value down to 0), rather than creating another variable for loop control (for instance , 'i').
Another thing, slightly off topic, is that your requirements were not clear. You only indicated that the value was bounded to (inclusive) values between 0 and 100. However, how many times you needed to repeat the evaluation was not really clear. Most people assume 100 was also the upper bound for your counter variable. Because the requirement is not clear, checking a value greater or equal to 1 for the count might be valid, although highly improbable (you don't really want to repeat a million times).
Lastly, you have to pay attention to AND and OR logic in your code. As it was indicated, your second while loop:
while (n >= 0 || n <= 100) {}
Is infinite. Because an OR evaluation only needs one part to evaluate to TRUE, any number entered will allow the loop to continue. Obviously, the intent was not allow values greater than 100. However, entering 150 allows the loop to continue because 150 >= 0. Likewise, -90 also allows the loop to continue because -90 <= 100. This is when pseudocode helps when you are learning. You wanted to express "a VALUE between lower_limit AND upper_limit." If you reverse the logic to evaluate values outside the limit, then you can say " value below lower_limit OR above upper_limit." These pseudocode expressions are very helpful determining which logical operator you need.
I also took the liberty to add a message to prompt the user for a value. Your program expects the user to enter two numbers (count and value) but only one prompt message is provided; unless they enter an out of range value.
extract even numbers from arrayList
ArrayList numberList = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));
numberList.stream().filter(i -> i % 2 == 0).forEach(System.out::println);

Perfect numbers. Something wrong

I am trying to accomplish a task. To print 4 perfect numbers which are between 1 and 10000.
In number theory, a perfect number is a positive integer that is equal to the sum of its proper positive divisors, that is, the sum of its positive divisors excluding the number itself.
Here's my code:
public class PerfectNumbers
{
public static void main(String[] args)
{
// Perfect numbers!
for (int number = 1; number < 10000; number++)
{
int sum = 0;
int i = 1;
while (i < number)
{
if (number % i == 0)
{
sum += i;
i++;
}
else
{
i++;
continue;
}
if (sum == number)
{
System.out.println(number);
}
else
{
continue;
}
}
}
}
}
The output is:
6
24 <--- This one is wrong because next must be 28.
28
496
2016
8128
8190
What is wrong in my code? Thank you.
The if (sum == number) check needs to be done outside the loop. Otherwise you might pick up numbers such that the sum of a subset of divisors equals the number.
In fact, 24 is one such example since 1+2+3+4+6+8=24. Your code prematurely concludes that 24 is perfect, despite it also being divisible by 12.
Your code prints 24 because when you step through the loop as i = 8 the sum of all numbers is 1+2+3+4+6+8 = 24 so your condition gets met. You need to add another conditional to the print to prevent it from printing when the summation has not yet been completed. In this case you haven't yet added 12 to make the calculation valid.
I would move the if statement outside the while loop so it is checked only after your sum is calculated.

Categories