【笔试记录】腾讯音乐 | 20230903 | cpp (更新ing)

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
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值