信奥一本通:C++ 入门算法训练 —— 四叶玫瑰数、错误票据(附代码)

例题 —— 四叶玫瑰数

题目背景

        四叶玫瑰数是指一个四位数,其各位上的数字的四次方之和等于本身。给定两个正整数N和M,请将N~M (1<=N<=M<=1000000)之间 (含N和M)的四叶玫瑰数按从小到大的顺序输出。

        例如: N=1234,M=2345时,输出四叶玫瑰数1634。

输入格式

        第一行输入两个正整数N、M (1<=N<=M<=1000000)

输出格式

        输出一行,包含若干个用一个空格隔开的正整数,表示N~M之间的四叶玫瑰数按从小到大的顺序的输出结果

输入输出样例

输入

1234 2345

输出

1634

说明 / 提示

注意:

        题目数据保证给定的N~M范围内至少有一个四叶玫瑰数

参考代码

#include <iostream>
#include <cmath>
using namespace std;

// 判断一个数是否是四叶玫瑰数
bool isFourLeafRose(int x) {
    int temp = x;
    // 将x的各位数字存入数组
    int digits[4];
    for (int i = 0; i < 4; i++) {
        digits[i] = temp % 10;
        temp /= 10;
    }
    // 计算各位数字的四次方之和
    int sum = 0;
    for (int i = 0; i < 4; i++) {
        sum += pow(digits[i], 4);
    }
    // 判断是否等于原数
    return sum == x;
}

// 输出N~M之间的四叶玫瑰数
void printFourLeafRose(int N, int M) {
    // 遍历N~M之间的四位数
    for (int x = max(1000, N); x <= min(9999, M); x++) {
        // 如果是四叶玫瑰数,输出
        if (isFourLeafRose(x)) {
            cout << x << endl;
        }
    }
}

int main() {
    // 输入N和M
    int N, M;
    cin >> N >> M;
    // 输出结果
    printFourLeafRose(N, M);
    return 0;
}

举一反三 —— 错误票据

题目背景

        某涉密单位下发了某种票据,并要在年终全部收回。

        每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。

        因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。

        你的任务是通过编程,找出断号的ID和重号的ID

        假设断号不可能发生在最大和最小号

输入格式

        要求程序首先输入一个整数N(N<100)表示后面数据行数。

        接着读入N行数据。

        每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。

        每个整数代表一个ID号。

输出格式

        要求程序输出1行,含两个整数m n,用空格分隔。

        其中,m表示断号ID,n表示重号ID

输入输出样例

输入样例

2
5 6 8 11 9 
10 12 9

输出样例

7 9

参考代码

#include<iostream>
using namespace std;
int main() {
    int N,a,tag[100001] = { 0 };//N行数据
    cin >> N;
    int start,m=-1,n=-1;//不一定从头开始呢!!

    while (cin >> a) {
        tag[a]++;
    }

    for (start = 0; start < 100000; start++) {
        if (tag[start] != 0) break;
    }//找到起点

    for (int i = start; i < 100000; i++) {
        if (tag[i] == 0) {
            m = i;
        }
        else if (tag[i] == 2){
            n = i;
        }
        if (m!=-1 && n!=-1)break;//都找到直接退出
    }

    cout << m << ' ' << n << endl;
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗者才子酒中仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值