用C++生成由M个数字组成的能被5整除的N位数
给定一个数字N和一个包含M个数字的数组,我们的任务是找到由给定的M个数字组成的、能被5整除的N位数的个数。
让我们看一些例子来理解问题的输入和输出。
输入:
N = 2 M = 3 arr = {5, 6, 3}
输出:
2
有2个能被5整除的N位数:35和65。让我们看另一个例子。
输入:
N = 1 M = 7 arr = {2, 3, 4, 5, 6, 7, 8}
输出:
1
在给定的数组中,只有一个1位数能被5整除。所以,我们的任务是找到可以由给定数字组成的、能被5整除的N位数的个数。
为了能被5整除,这个数必须以0或5结尾。让我们看看算法
算法
- 1. 检查给定数组中是否存在0和5。2. 如果同时存在0和5,则有两种方法将数字放在个位数。否则,只有一种方法将数字放在个位数。
- 将计数初始化为2。
- 现在,剩余的位置分别有m - 1, m - 2, m - 3, ... n种方法填充。
- 编写一个从0迭代到n - 1的循环。
- 递减数组的大小。
- 将它乘以计数。
- 如果只有一个数字0或5,则只有一种方法将数字放在个位数。
- 将计数初始化为2。
- 现在,剩余的位置分别有m - 1, m - 2, m - 3, ... n种方法填充。
- 编写一个从0迭代到n - 1的循环。
- 递减数组的大小。
- 将它乘以计数。
- 如果没有数字0或5,则我们无法构成能被5整除的数。在这种情况下返回-1。
实现
以下是上述算法在C++中的实现
#include <bits/stdc++.h> using namespace std; int numbers(int n, int m, int arr[]) { bool isZeroPresent = false, isFivePresent = false; int numbersCount = 0; if (m < n) { return -1; } for (int i = 0; i < m; i++) { if (arr[i] == 0) { isZeroPresent = true; } if (arr[i] == 5) { isFivePresent = true; } } if (isZeroPresent && isFivePresent) { numbersCount = 2; for (int i = 0; i < n - 1; i++) { m--; numbersCount = numbersCount * m; } } else if (isZeroPresent || isFivePresent) { numbersCount = 1; for (int i = 0; i < n - 1; i++) { m--; numbersCount = numbersCount * m; } } else { return -1; } return numbersCount; } int main() { int arr[] = {5, 6, 3}; cout << numbers(2, 3, arr) << endl; return 0; }
输出
如果您运行以上代码,您将得到以下结果。
2
广告