如何在指定区间内找到数字的约数?
How to find divisors of number on specified interval?
我想用 WHILE 循环写一个简单的程序,用它你可以得到你输入的数字的所有除数。
例如,您想要数字 30 的所有约数,它们是:1、2、3、5、6、10、15、30。
现在你希望程序只显示间隔(例如)从 5 - 10 的数字,即 5、6 和 10。
到目前为止我尝试的是使用 FOR 语句获取所有这些除数,但没有间隔,所以我被卡住了,不知道如何在 WHILE 循环中也能做到这一点。
#include <iostream>
using namespace std;
int main() {
int input_number;
cin >> input_number;
cout << "All numbers are " << input_number << endl;
for (int i = 1; i <= input_number; i++) {
if (input_number % i == 0) {
cout << i << " ";
}
}
return 0;
}
另外感谢您的帮助。
为什么要将此作为 while
循环执行? for
绝对是这里loop的正确选择。检查 all 除数通过以下方式非常清楚地完成:
for (int i = 1; i <= input_number; i++) { ... }
如果你想添加一个更窄的window,你可以改变循环的边界:
for (int i = lower_bound; i <= upper_bound; i++) { ... }
将其变成 while
循环只需要将这些语句展开为:
int i = lower_bound;
while (i <= upper_bound) {
...
i++;
}
但这更容易出错——如果你的循环体中有一个 continue
,i
就不会递增。
在 while
循环中解决这个问题可能不像在 for
循环中解决它那么简单(或蛮力)。
考虑使用 while
:
的循环再现
int input_number;
std::cin >> input_number;
int i = 1; //Start trying to divide the input number by 1
int limit = input_number; //Termination condition for the loop
while(i < limit) {
if(input_number % i == 0) { //If divisible by i, both i and input_number/i are factors
std::cout << i << " " << input_number / i << " ";
}
++i; //Try dividing by the next integer
/*Set the limit to our latest input_number/i so we don't get duplicate
results (e.g. (5, 6) and (6, 5) for input_number = 30)*/
limit = input_number / i;
}
对于 input_number = 30
,此循环仅运行 5 次迭代,而 for
循环版本运行 30 次迭代。
底线
for
循环和 while
循环可以互换,但是使用 for
循环处理问题可能比使用 [=11] 循环更快地找到不同的解决方案=] 循环,反之亦然,因为它们可以帮助您从不同的角度思考问题。
额外信息
for
循环版本允许某些优化技术,例如并行累加器,这在 while
循环版本中是不可能的,因为每次迭代都依赖于前一次迭代。
我想用 WHILE 循环写一个简单的程序,用它你可以得到你输入的数字的所有除数。
例如,您想要数字 30 的所有约数,它们是:1、2、3、5、6、10、15、30。 现在你希望程序只显示间隔(例如)从 5 - 10 的数字,即 5、6 和 10。
到目前为止我尝试的是使用 FOR 语句获取所有这些除数,但没有间隔,所以我被卡住了,不知道如何在 WHILE 循环中也能做到这一点。
#include <iostream>
using namespace std;
int main() {
int input_number;
cin >> input_number;
cout << "All numbers are " << input_number << endl;
for (int i = 1; i <= input_number; i++) {
if (input_number % i == 0) {
cout << i << " ";
}
}
return 0;
}
另外感谢您的帮助。
为什么要将此作为 while
循环执行? for
绝对是这里loop的正确选择。检查 all 除数通过以下方式非常清楚地完成:
for (int i = 1; i <= input_number; i++) { ... }
如果你想添加一个更窄的window,你可以改变循环的边界:
for (int i = lower_bound; i <= upper_bound; i++) { ... }
将其变成 while
循环只需要将这些语句展开为:
int i = lower_bound;
while (i <= upper_bound) {
...
i++;
}
但这更容易出错——如果你的循环体中有一个 continue
,i
就不会递增。
在 while
循环中解决这个问题可能不像在 for
循环中解决它那么简单(或蛮力)。
考虑使用 while
:
int input_number;
std::cin >> input_number;
int i = 1; //Start trying to divide the input number by 1
int limit = input_number; //Termination condition for the loop
while(i < limit) {
if(input_number % i == 0) { //If divisible by i, both i and input_number/i are factors
std::cout << i << " " << input_number / i << " ";
}
++i; //Try dividing by the next integer
/*Set the limit to our latest input_number/i so we don't get duplicate
results (e.g. (5, 6) and (6, 5) for input_number = 30)*/
limit = input_number / i;
}
对于 input_number = 30
,此循环仅运行 5 次迭代,而 for
循环版本运行 30 次迭代。
底线
for
循环和 while
循环可以互换,但是使用 for
循环处理问题可能比使用 [=11] 循环更快地找到不同的解决方案=] 循环,反之亦然,因为它们可以帮助您从不同的角度思考问题。
额外信息
for
循环版本允许某些优化技术,例如并行累加器,这在 while
循环版本中是不可能的,因为每次迭代都依赖于前一次迭代。