1 完美数
1.1 题目描述
小红定义一个数为“完美数”,当且仅当该数仅有一个非零数字。例如 5000, 4, 1, 10, 200 都是完美数。
小红拿到了一个大小为 n(2 <= n <= 2000)的数组 a,她希望选择数组中的两个元素(1 <= a[i] <= 10^9),满足它们的乘积为完美数。 小红想知道,共有多少种不同的取法?
输入描述:
第一行输入一个整数 n,表示数组大小。
第二行输入 n 个整数,整数之间用空格隔开,表示数组中的元素。
输出描述:
输出一个整数,表示取法个数。
输入示例:
4
25 2 1 16
输出示例:
3
提示信息:
25 * 2 = 50; 2 * 1 = 2; 25 * 16 = 400。
1.2 问题分析
问题出口在于:如何判断数字是不是完美数?
我一开始的想法是:每次看数字的最后一位,如果它是0,就去除;如果不是0,就判断剩下的数字是否小于10,如果小于10(也就是说只剩一个非0数字)则是完美数,如果大于10,则不是完美数。
#include <iostream>
#include <vector>
using namespace std;bool perfect_num(int num){while(num % 10 == 0){ // 如果num能被10整除则循环num = num / 10; // num去除一个0,继续循环}if(num < 10) return true;else return false;
}int main(){int n; // 数组的大小cin >> n;vector<int> a(n, 0);for(int i = 0; i < n; i++){cin >> a[i];}int result = 0;for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(perfect_num(a[i] * a[j])){result++;} }}cout << result << endl;return 0;
}
但是代码有一个致命错误:INT整数相乘会溢出!!!
例如在下面这个测试用例中,我第一个数和第二个数的乘积应该是3467832415636345,但是我程序中计算出来的是-1488565383。显然和预期结果不一样。
所以一定要把int改成long long!下面的代码就对了。
#include <iostream>
#include <vector>
using namespace std;bool perfect_num(long long num1, long long num2){long long num = num1 * num2;while(num % 10 == 0){ // 如果num能被10整除则循环num = num / 10; // num去除一个0,继续循环}if(num < 10) return true;else return false;
}int main(){int n; // 数组的大小cin >> n;vector<int> a(n, 0);for(int i = 0; i < n; i++){cin >> a[i];}int result = 0;for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(perfect_num(a[i], a[j])){result++;} }}cout << result << endl;return 0;
}
2 可爱串
2.1 题目描述
我们定义子序列为字符串中可以不连续的一段,而子串则必须连续。例如 rderd 包含子序列 "red”,且不包含子串"red”,因此该字符串为可爱串。
小红想知道,长度为 n(3 <= n <= 10 ^ 5)的、仅由 'r''e''d' 三种字母组成的字符串中,有多少是可爱串? 答案请对 10 ^ 9 + 7 取模。
输入描述:
输入共一行,包含一个正整数 n
输出描述:
输出一个正整数,代表可爱串的数量
输入示例:
4
输出示例:
3
提示信息:
"reed"、"rerd"、"rded"
2.2 问题分析
好二叉树
题目描述
小红定义一个二叉树为“好二叉树”,当且仅当该二叉树所有节点的孩子数量为偶数(0 或者 2)。
小红想知道,n(1<= n <=3000)个节点组成的好二叉树,共有多少种不同的形态?
答案请对 10 ^ 9 + 7 取模。
输入描述
输入一个正整数 n
输出描述
输出一个正整数,代表好二叉树的数量
输入示例
5
输出示例
2