Finding a number with conditions while using for loop

125 Ansichten (letzte 30 Tage)
Bryan Cordeiro
Bryan Cordeiro am 1 Apr. 2020
Bearbeitet: Image Analyst am 21 Dez. 2021
Write a program in a script file that finds the smallest odd integer that is divisible by 13 and whose square root is greater than 120. Use a for-loop in the program. The loop should start from 1 and stop when the number is found. The program prints the message “The required number is:” and then prints the number. Hint: Use rem(n,2)~=0 for finding odd integers, and rem(n,13)==0 for finding the number to be divisible by 13.
I know this is easily solved through other methods but I don't know what to do.
I've rewritten my code many times and don't know what I am doing.
  3 Kommentare
Bryan Cordeiro
Bryan Cordeiro am 1 Apr. 2020
clc
clear
n=120^2;
for i=1:n -------- IM NOT SURE WHAT NUMBER SHOULD BE IN PLACE OF THE N HERE
if rem(n,2)~=0 && rem(n,13)==0;
fprintf('The required number is: %d\n', n);
else
n=n+1;
end
end
but it doesn't end the loop... so I'm not sure if its the right way to do it
Keep in my I have very limited knowledge of matlab
Bryan Cordeiro
Bryan Cordeiro am 1 Apr. 2020
it prints The required number is: 14417 which seems to be the right answer however im not sure if the code is right due to it repeating the the line a bunch of times. How do I end the loop when it finds the number?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Image Analyst
Image Analyst am 2 Apr. 2020
Bearbeitet: Image Analyst am 2 Apr. 2020
You need a continue. And you should print i, NOT n. Then, after the fprintf() put a break
if sqrt(i) < 120
continue; % Skip to end of loop and continue iterating when sqrt(i) < 120
end
fprintf('The required number is: %d.\n', i);
break; % Break out of loop.
And you could just have n be some huge number, like 100 billion or whatever.
  5 Kommentare
Image Analyst
Image Analyst am 2 Apr. 2020
No, it's not. Never change the loop iterator or it's starting and ending values in the for loop body. You won't get the expected results. For example
n = 9;
for k = 1 : n
fprintf('Iteration %d, n = %d.\n', k, n);
n=n+1;
end
gives
Iteration 1, n = 9.
Iteration 2, n = 10.
Iteration 3, n = 11.
Iteration 4, n = 12.
Iteration 5, n = 13.
Iteration 6, n = 14.
Iteration 7, n = 15.
Iteration 8, n = 16.
Iteration 9, n = 17.
You can see that you still do iterations 1 through 9 despite the fact that you unwisely changed the ending value inside the loop from 9 to (eventually) 17. You got 9 iterations, not 17.
Here is how I'd do it:
fprintf('Beginning to run %s.m ...\n', mfilename);
for k = 1 : 100000
if sqrt(k) < 120 || rem(k, 13) ~= 0
continue; % Skip to end of loop and continue iterating when sqrt(i) < 120
end
% If you get to here, you've found it!
fprintf('The required number is: %d.\n', k);
break; % Break out of loop.
end
fprintf('Done running %s.m.\n', mfilename);
Bryan Cordeiro
Bryan Cordeiro am 3 Apr. 2020
thanks alot for the comments explaining. I appreciate it!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

John D'Errico
John D'Errico am 2 Apr. 2020
Bearbeitet: John D'Errico am 2 Apr. 2020
Why use a loop? ;-)
Lets see, the smallest INTEGER with the desired property is 14404. We can get that as:
n = 120;
>> m = n^2 + mod(-n^2,13)
m =
14404
>> sqrt(m)
ans =
120.01666550942
>> rem(m,13)
ans =
0
But, then I see that you needed to find the smallest ODD integer, and since the smallest such integer is even, we need to find a solution yielding the smallest odd integer. This will work, but it is sort of a kludge:
n = 120;
m = n^2 + mod(-n^2,13);
if rem(m,2) == 0
m = m + 13;
end
m
m =
14417
Well, yes. This is a homework problem.
Hmm. How would I solve it using a loop? After all, you are making a credible effort.
The smallest number that satisfies the listed conditions MUST be one of the integers in the set: [120^2 + (0:(2*13-1))]. So we never need to loop over more than 26 elements beyond 120^2. THINK ABOUT IT! As such, I could set this up as a for loop, over 26 numbers, then breaking out of the loop when we find success.
Or, you could just use a while loop, which requires far less thought.
n = 120;
m = n^2;
while ~isequal(mod(m,[13,2]),[0 1])
m = m + 1;
end
m =
14417
You should see the isequal test reduces two tests into one vectorized test. As well, since we started out at 120^2, we absolutely know that sqrt(m) must be greater than 120.

baiel kurstanbek
baiel kurstanbek am 21 Dez. 2021
Write a program in a script file that finds the smallest even integer that is divisible by a and by b whose square root is greater than c. Use a loop in the program. The loop should start from 1 and stop when the number is found.
Sample Input: 3
5
7
Sample Output: 60
  1 Kommentar
Image Analyst
Image Analyst am 21 Dez. 2021
Bearbeitet: Image Analyst am 21 Dez. 2021
@baiel kurstanbek Read this link:
Hint: Look up the functions sqrt(), rem(), mod(), gcd(), break, for, and while. Start a new question (not part of @Bryan Cordeiro's question) with your attempt at code if you still have questions.
Usually divisible means that the ratio of the two numbers is an integer like
output = 60/3
output = 20
however it looks like you've either made a typo (like 60 should have been 70), or you're allowing absolutely anything since 60 is not an integer multiple of 7
output = 60/7
output = 8.5714
So in that case (allowing results with fractional parts), any number is divisible by any other number and you don't need to check for divisibility.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by