在C ++中所有相邻元素都这样使得其中一个除以另一个的数组的计数
给定两个分别名为“一个”和“另一个”的整数。目标是找到可能的数组数量,使-
数组中的元素介于1和“另一个”之间。
数组的所有元素都是以arr[i]除以arr[i+1]或arr[i+1]除以arr[i+2]...等等。
数组的长度为“1”。
例如
输入值
one = 3, another = 2输出结果
所有相邻元素都被一个相邻元素相除的数组的计数为: 8
说明
The arrays will be: [ 1,1,1 ], [ 1,1,2 ], [ 1,2,1 ], [ 1,2,2 ], [ 2,1,1 ], [ 2,1,2 ], [ 2,2,1 ], [ 2,2,2 ]
输入值
one = 2, another = 3输出结果
所有相邻元素都被一个相邻元素相除的数组的计数为: 7
说明
The arrays will be: [ 1,1 ], [ 2,2 ], [ 3,3 ], [ 1,2 ], [ 1,3 ], [ 2,2 ], [ 3,3 ]
以下程序中使用的方法如下-
我们知道每个数组的第一个元素可以是[1,另一个]范围内的任何数字。下一个元素将始终是先前的倍数或先前的因数,因此除数条件成立。因子或倍数也应小于“另一个”。我们将使用动态编程来存储计算。为此,我们使用数组arr[][]。arr[1][another]将为1,因为它们将是单元素数组。arr[i][j]=arr[i-1][j]+先前元素的因子+先前元素的倍数(小于另一个)。
以一个整数和另一个作为输入。
功能adjacent_elements(intfirst,intsecond)返回数组的计数,在该数组中所有相邻元素都是一个,而另一个被除。
将初始计数设为0,并使用数组arr[size][size]。
使用memset将所有计数初始化为0。
取两个向量-vec用于存储因子,而vec_2用于存储倍数。
使用两个for循环从i=t到i=second和j=2*i到j=second遍历。i递增j。
将i添加到vec[j],将j添加到vec_2[i]。在j循环之后,还将i添加到vec[i]。
使用for循环设置arr[1][i]。
再次遍历数组,现在遍历vec和vec_2并向arr[i][j]添加因子和倍数。
最后,添加所有arr[first][i]以计数并清除vec[i]和vec_2[i]。
返回计数作为结果。
示例
#include <bits/stdc++.h> using namespace std; #define size 1000 int adjacent_elements(int first, int second){ int count = 0; int arr[size][size]; memset(arr, 0, sizeof arr); vector<int> vec[size], vec_2[size]; memset(vec, 0, sizeof vec); memset(vec_2, 0, sizeof vec_2); for (int i = 1; i <= second; i++){ for (int j = 2*i; j <= second; j += i){ vec[j].push_back(i); vec_2[i].push_back(j); } vec[i].push_back(i); } for (int i = 1; i <= second; i++){ arr[1][i] = 1; } for (int i = 2; i <= first; i++){ for (int j = 1; j <= second; j++){ arr[i][j] = 0; for (auto it: vec[j]){ arr[i][j] += arr[i−1][it]; } for (auto it : vec_2[j]){ arr[i][j] += arr[i−1][it]; } } } for (int i = 1; i <= second; i++){ count = count + arr[first][i]; vec[i].clear(); vec_2[i].clear(); } return count; } int main(){ int one = 2, another = 2; cout<<"所有相邻元素都被一个相邻元素相除的数组的计数为: "<<adjacent_elements(one, another); return 0; }输出结果
如果我们运行上面的代码,它将生成以下输出-
所有相邻元素都被一个相邻元素相除的数组的计数为: 4