首页 > 其他 > 详细

PAT乙级1005

时间:2019-10-16 09:14:28      阅读:95      评论:0      收藏:0      [点我收藏+]

题目链接

https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776

题解

这份代码最后一个测试点过不了,找不到原因

// PAT BasicLevel 1005
// https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776
#include <iostream>
#include <algorithm>
using namespace std;

#define N 105  // 数组大小
bool isKey[N];  // N个数字是否为关键数:isKey[i]==true,则i是关键数;否则i不是关键数
bool isValid[N]; // N个数字是否被用户输入:isValid[i]==true,则i已被用户输入;否则i未被用户输入
void callatz(int n); // 循环处理isKey[n]:n若被覆盖,则不必往下计算,函数结束;若n未被覆盖,则覆盖n并按规则更新n。循环以上过程

int main()
{
    // 默认N个数字都未被覆盖,即N个数字是关键数
    fill(isKey,isKey+N,true);

    // 记录k个正整数n;对于每个正整数n,调用callatz()函数(用户输入的正整数n,并不会被自己覆盖,所以传参时直接将n更新)
    int k,n;
    scanf("%d", &k);  // k个整数
    for(int i=0;i<k;++i){
        scanf("%d",&n);
        isValid[n] = true; // 记录用户输入的正整数n
        callatz(n % 2 == 0 ? n / 2 : (3 * n + 1) / 2);
    }

    // 输出结果
    bool isFirstKey=true;
    for (int i = N-1; i >=0; --i){
        if(isValid[i]&&isKey[i]){
            if(isFirstKey){
                printf("%d",i);
                isFirstKey = false;  // 输出第一个关键数后,之后输出的关键数就不是第一个关键数了
            }
            else{
                printf(" %d",i);
            }
        }
    }

    system("pause");
    return 0;
}

void callatz(int n)
{
    while(n!=1){
        // n未被覆盖
        if(isKey[n]){
            // 将n覆盖
            isKey[n] = false;

            // 按照规则更新n
            if (n % 2 == 0){
                n = n / 2;
            }
            else{
                n = (3 * n + 1) / 2;
            }
        }
        // n已被覆盖,不必往下计算
        else{
            break;
        }
    }
}

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


PAT乙级1005

原文:https://www.cnblogs.com/chouxianyu/p/11682119.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!