PTA刷题笔记

本文记录了PTA平台上几个编程挑战的解决方案,包括(3n+1)猜想、数字拼音转换、字符计数、关键数字查找和整数格式转换等。每个问题都强调了关键点,如数字操作、字符串处理和排序算法,对于初学者来说是很好的实践练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1001 害死人不偿命的(3n+1)猜想

任给一个正整数n,如果是偶数则返回n/2,如果是奇数,返回(3n+1)/2,最后一定在某一步返回n=1, 求返回1时的步数。

代码:

#include<iostream>

using namespace std;

int main(){

        int n, count = 0;

        cin>>n;

        while(n != 1){

            if(n%2 != 0)n=3*n+1;

            n=n/2;

            count++;

        }

cout<<count;

return 0; 

}

1002 写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字

拼音数字之间有空格,最后的拼音数字末尾没有空格。

#include<iostream>
#include<string>
int main(){
    string s;
    cin >> s;
    int sum = 0;
    string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; 
    for(int i=0; i < s.length(); i++){
        sum += (s[i] - '0');///数字字符变整型数值
    }
    string num = to_string(sum);//////整型变字符串
    for(int i = 0; i < num.length(); i++){
        if(i != 0) cout >> " ";
        cout >> str[num[i]-'0'];///数字字符变整型数值
    }

    return 0;
}

重点:to_string函数能将其他类型转为string;数字字符变为整型数值用该字符-'0';

1003 我要通过!

#include<iostream>
#include<map>
int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        string s;
        cin >> s;
        int p, t;
        map<char, int>m;\\创建字符:数值类型的map存储对应字母出现的次数
        for(int j = 0; j < s.length(); j++){
            m[s[j]]++;
            if(m[s[j]] == 'P') p = j;
            if(m[s[j]] == 'T') t = j;
        }
        if(m['P']==1&&m['T']==1&&m['A']!=0&&t-p!=1&&p*(t-p-1)==s.length()-t-1&&m.size()==3)
            cout>>"YES\n";
        else
            cout>>"NO\n";
    }

    return 0;

}

重点:使用map存储字符串种类,并且能知道每种字符出现的次数。

1004 成绩排名
读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的学号和姓名
#include<iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    int name, num, socre, max = 1, min = 101;
    string maxname, minname, maxnum, minnum;
    for(int i = 0; i < n; i++){
        cin >> name >> num >> socre;
        if(socre > max){max=socre;maxname=name;maxnum=num;}
        if(sorce < min){min=socre;minname=name;minnum=num;}
    }
    cout<<maxname<<" "<<maxnum<<"\n";
    cout<<minname<<" "<<minnum<<"\n";
}

重点:cin可以读取用空格隔开的变量;题目要求比较成绩,只需输出最大成绩和最小成绩及其对应的学号和姓名,将三个变量而分开存储满足条件后更新。

1005 继续(3n+1)猜想

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

#include<iostream>
using namespace std;
int cmp(int a, int b){return a>b;}
int main(){
    int n,k, flag = 0;
    cin>>k;
    int arr[10000];
    vector<int> v(k);
    for(int i = 0; i < k; i++){
        cin>>n;
        v[i] = n;
        if(n%2 != 0)n = 3*n+1;
        n=n/2;
        if(arr[n] = 1)break;
        arr[n]=1;
    }
    sort(v.begin, v.end, cmp);
    for(int i = 0; i<k; i++){
        if(arr[v[i]]==0){
            if(flag==1)cout<<" ";
            cout<<v[i];
            flag = 1;
        }
    }
return 0;
}
        
        

重点:用vector存储输入数据,方便用sort函数进行从大到小的排序,sort函数以第一个参数为首地址第二个参数为尾地址,第三个参数为排序方法return a>b是从大到小排列,还可通过变换参数的方法改变排序方法。用数组arr[]下标表示数字对应值表示数字是否出现过,跟之前使用的map类似。也就是说如果键值对的关键字是数字的话可以用数组表示对应关系,如果关键字为字符则使用map。如果要求输出最后没有空格,并且没法控制最后的输出,则可以设置一个标志变量flag,初始值为0,变为1时输出空格,然后输出想输出的数据,也就是改变空格和数据的输出顺序。

1006 换个格式输出整数

#include<iostream>
using namespace std;
int main(){
    int a;
    cin>>a;
    int b[3] = {0};
    while(a!=0){
        b[i]=a%10;
        a=a/10;
    }
    for(int i = 0; i < b[2]; i++)
        cout<<'B';
    for(int i = 0; i < b[1]; i++)
        cout<<'S';
    for(int i = 0; i < b[0]; i++)
        cout << i+1;
    return 0;
}

重点:这题很简单,直接用while循环%截取每位对应数字然后存入数组即可,因为是按对应数字进行输出,所以需要对每一位进行分别储存。

1007 素数对猜想

有无穷多对相邻且相差为2的素数,相邻指两数之间没有其他素数,显然两相邻素数之差最少为2,因为偶数必然不是素数(1、2、3除外)

#include<iostream>
using namespace std;
bool isprime(int a){
    for(int i = 2; i * i <= a; i++){
        if(a % i == 0)return false;
    }
    return true;
}
int main(){
    int n, count = 0;
    cin>>n;
    for(int i = 5; i <= n; i++){
        if(isprime(i-2)&&isprime(i))count++;
    }
    cout<<count;
    return 0;
}

重点:确定一个数是否是素数的函数:i从2到平方小于等于a的整数,如果a能被其中任意一个数整除,则表示a不是素数。

由于1、2、3都是素数相差不是2,所以从i = 5开始遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值