1 solutions
-
0
小朋友,咱们现在换个思路来解决这个拼数的问题。就像你说的,我们从 10000 到 99999 这些五位数一个一个去看,把每个五位数拆分开,看看它的每一位数字是不是都在我们输入的卡片数字里,要是都在,那就说明这个五位数是可以用这些卡片拼出来的。下面我把这个思路拆成几个步骤来讲哈:
步骤一:读取输入
和之前一样,我们要先把题目给的卡片数量
n和每张卡片上的数字读进来。咱们还是用一个数组来存这些数字。步骤二:遍历所有五位数
从 10000 开始,一直到 99999,一个一个地看这些五位数。就像我们在一排房子里,一个一个房间去敲门看看是不是符合要求。
步骤三:拆分五位数
对于每一个五位数,我们要把它拆分成个位、十位、百位、千位和万位这五个数字。这就好像把一个大蛋糕切成五小块。
步骤四:判断拆分后的数字是否都在输入的卡片数字里
把拆分后的每个数字和输入的卡片数字比一比,看看是不是都能在卡片数字里找到。要是都能找到,那就说明这个五位数是可以用这些卡片拼出来的。
步骤五:统计符合要求的五位数的数量
每找到一个符合要求的五位数,我们就把数量加 1,最后得到的就是能拼出的不同五位数的总数啦。
下面是对应的 C++ 代码:
#include<bits/stdc++.h> using namespace std; int n; // 卡片的总数 int a[210]; // 用来存每张卡片上的数字 int ans = 0; // 最终能拼出的不同五位数的数量 // 判断一个五位数是否可以用输入的卡片数字拼出来 bool check(int num) { bool used[210] = {false}; // 标记每张卡片是否被使用 // 拆分五位数 int digit[5]; for (int i = 4; i >= 0; i--) { digit[i] = num % 10; num /= 10; } // 检查每个数字是否在卡片数字里 for (int i = 0; i < 5; i++) { bool found = false; for (int j = 0; j < n; j++) { if (!used[j] && a[j] == digit[i]) { used[j] = true; // 标记这张卡片已使用 found = true; break; } } if (!found) return false; // 如果有数字找不到对应的卡片,就不符合要求 } return true; } int main() { cin >> n; // 读取卡片的总数 for (int i = 0; i < n; i++) { cin >> a[i]; // 读取每张卡片上的数字 } // 遍历所有五位数 for (int i = 10000; i <= 99999; i++) { if (check(i)) ans++; // 如果这个五位数符合要求,答案加 1 } cout << ans << endl; // 输出结果 return 0; }代码里,
check函数就是用来判断一个五位数是否可以用输入的卡片数字拼出来的。在main函数里,我们先读取输入,然后遍历所有五位数,调用check函数进行判断,最后输出能拼出的不同五位数的数量。我给你举个例子帮助你理解哈。假如输入的卡片数字是
1 2 3 4 5,当我们检查五位数12345的时候,把它拆分成1、2、3、4、5,然后发现这些数字都在卡片数字里,所以12345就是符合要求的五位数。要是检查五位数12346,拆分成1、2、3、4、6,发现6不在卡片数字里,那12346就不符合要求啦。
- 1
Information
- ID
- 1021
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 7
- Tags
- (None)
- # Submissions
- 18
- Accepted
- 8
- Uploaded By