如何在指定的时间间隔内找到数字的除数?

时间:2016-03-01 15:59:25

标签: c++ while-loop numbers

我想使用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;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

为什么要将此作为while循环执行? for绝对是这里循环的正确选择。通过以下方式非常清楚地检查所有除数:

for (int i = 1; i <= input_number; i++) { ... }

如果你想为它添加一个更窄的窗口,你可以只改变循环的界限:

for (int i = lower_bound; i <= upper_bound; i++) { ... }

将其转换为while循环只需要将这些语句解包到:

int i = lower_bound;
while (i <= upper_bound) {
    ...
    i++;
}

但这更容易出错 - 如果你的循环体中有continuei就不会增加。

答案 1 :(得分:1)

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循环解决问题可能会比使用while来解决问题更快地使用其他解决方案循环,反之亦然,因为它们可以帮助您从不同的角度思考问题。

额外信息

for循环版本允许某些优化技术,例如并行累加器,这在while循环版本中是不可能的,因为每次迭代都依赖于前一个。