查找连续数字的序列,其倍数为N.

时间:2017-01-15 16:58:28

标签: c++ algorithm math

我有一个输入N的练习,它希望我找到一个连续数字的序列,其倍数等于N。示例

Input | Output
  60   | 3 5

3 * 4 * 5 = 60

我尝试了什么

cin>>b;
for (int i = 2; i <=b; ++i)
{
    c=1;
    for (int j = i; j <=b; ++j)
    {
        c*=j;
        if(c==b){
            cout<<i<<" "<<j<<endl;
            return 0;
        }else if(c>b){
            j=b;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

由于这个赋值,如果没有找到具有给定起始值i的序列,内部循环将永远不会终止:

else if (c > b) {
    j = b;
}

相反,你应该这样做:

else if (c > b) {
    break;
}

这将终止内部循环并检查具有下一个起始值i+1的序列。

您还应该考虑(非常常见)情况,即唯一的序列只包含一个元素N本身。

答案 1 :(得分:1)

这是Python中的一个可行的解决方案(参见C ++版本的文章末尾):

def seq_with_product(n):
    """Return a sequence of consecutive numbers whose product is n."""
    i, curr_prod = 1, 1
    max_j = int(n**0.5) + 1 # n**0.5 is square root of n
    for j in range(2, max_j + 1):
        curr_prod *= j
        while curr_prod > n and i < j-1:
            curr_prod /= i
            i += 1
        if curr_prod == n:
            return range(i, j+1)
    return []

i j 成为当前序列中的起始和结束编号。您从具有最小乘积[1, 2]的序列开始,并检查它是否小于给定目标n。如果是,则需要增加产品,因此通过增加 j 来包含下一个数字。一旦你找到一个更大的产品,你就开始从产品中删除数字,从最小的(while循环)开始。如果您获得了确切的产品,那么您的答案就是 i j 之间的数字。例如,这就是你得到60的答案:

[1, 2]          # too small, include the next number
[1, 2, 3]       # too small, include the next number
[1, 2, 3, 4]    # too small, include the next number
[1, 2, 3, 4, 5] # too big, remove the first number
[2, 3, 4, 5]    # too big, remove the first number
[3, 4, 5]       # found

请注意,您无需考虑大于目标数字的平方根加上1的数字,因此您可以停在max_j

在C ++中,它将类似于:

int i = 1, curr_prod = 1;
int max_j = sqrt(n) + 1;
for (int j = 2; j <= max_j; j++) {
  curr_prod *= j;
  while (curr_prod > n && i < j - 1) {
    curr_prod /= i;
    i += 1;
  }
  if (curr_prod == n) cout << i << " " << j << endl;
}