我有一个输入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;
}
}
}
答案 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;
}