【译】如何生成包含给定数字A和B的相邻元素差异相等的N大小阵列

146 阅读3分钟

生成包含给定数字A和B的相邻元素差异相等的N大小阵列

  • 最后更新 : 2021年8月10日

给定两个自然数AB(B>=A)和一个整数N,你的任务是生成一个非递减的自然数数组 ,使得A和B必须是数组的一部分,并且每一对相邻元素之间的差值相同,尽可能保持数组的最大元素最小。

例子。

输入。 A = 10, B = 20, N = 4
输出。 5 10 15 20
解释。 数组{5, 10, 15, 20}只包含自然数,A=10和B=20都包含在数组中。每一对相邻数的差值是5,最大的元素是20,不能再缩减了。

输入。 A = 12, B = 33, N = 2
输出。 12 33

输入。 A = 7, B = 17, N = 5
输出。 2 7 12 17 22

办法。所 需的数组形成一个AP系列。由于A和B必须包含在AP中,相邻项之间的共同差值d必须是(B-A)的除数。为了使最大项最小化,最佳方法是生成满足给定条件的具有最小公差的数组。这个问题可以通过以下步骤解决。

  • 1B-A之间的所有d值上进行迭代。
  • 如果dB-A的一个因子,并且从AB具有共同差值 d的元素的数量不超过N,则继续进行。否则,移到下一个d值。
  • 有两种可能的情况
    • _在_这种情况下,数组的第一个元素将是B-(d*(N-1))
    • _在_这种情况下,数组的第一个元素将是B - d*( B-1 )/d(即1)。
  • 用第一个元素和公差来打印数组。

下面是上述方法的实现。

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to print the array of N
// natural numbers in increasing order
// with equal difference of adjacent
// elements and containing A and B
void generateAP(int A,int B,int N)
{
// maximum possible difference
int d = B - A;
int cd, f;
// Iterating over all values of d
for (int i = 1; i <= d; i++) {
// Check if i is a factor of d
// and number of elements from
// a to b with common difference
// d are not more than N
if (d % i == 0 && (d / i) + 1 <= N) {
// Number off natural numbers
// less than B and having
// difference as i
int cnt = min((B - 1) / i, N - 1);
// Calculate the 1st element of
// the required array
f = B - (cnt * i);
cd = i;
break;
}
}
// Print the resulting array
for (int i = 0; i < N; i++) {
cout << (f + i * cd) <<" ";
}
}
// Driver code
int main()
{
int A = 10, B = 20, N = 4;
// Function call
generateAP(A, B, N);
return 0;
}

输出

5 10 15 20 

时间复杂度。 O(N + √B)
辅助空间。 O(1)

读者请注意!现在不要停止学习。掌握竞争性编程的所有重要数学概念,并以适合学生的价格获得 CP课程的基本数学以适合学生的价格获得所有重要的数学概念。要完成从学习语言到DS Algo以及更多的准备工作,请参考 完整的面试准备课程.

我的个人笔记 箭头_下降_上升

保存