生成包含给定数字A和B的相邻元素差异相等的N大小阵列
- 最后更新 : 2021年8月10日
给定两个自然数A和B(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)的除数。为了使最大项最小化,最佳方法是生成满足给定条件的具有最小公差的数组。这个问题可以通过以下步骤解决。
- 在1到 B-A之间的所有d值上进行迭代。
- 如果d是 B-A的一个因子,并且从A到 B具有共同差值 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 Bvoid generateAP(int A,int B,int N){// maximum possible differenceint d = B - A;int cd, f;// Iterating over all values of dfor (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 Nif (d % i == 0 && (d / i) + 1 <= N) {// Number off natural numbers// less than B and having// difference as iint cnt = min((B - 1) / i, N - 1);// Calculate the 1st element of// the required arrayf = B - (cnt * i);cd = i;break;}}// Print the resulting arrayfor (int i = 0; i < N; i++) {cout << (f + i * cd) <<" ";}}// Driver codeint main(){int A = 10, B = 20, N = 4;// Function callgenerateAP(A, B, N);return 0;} |
输出
5 10 15 20
时间复杂度。 O(N + √B)
辅助空间。 O(1)
读者请注意!现在不要停止学习。掌握竞争性编程的所有重要数学概念,并以适合学生的价格获得 CP课程的基本数学以适合学生的价格获得所有重要的数学概念。要完成从学习语言到DS Algo以及更多的准备工作,请参考 完整的面试准备课程.
我的个人笔记 箭头_下降_上升
保存