用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

更新於:2021年10月21日

142 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.