C++语言题库(二)—— PAT

发布于:2024-05-13 ⋅ 阅读:(145) ⋅ 点赞:(0)

目录

1. 求幂之和

2. 韩信点兵

3. 有理数比较

4. 西安距离

5. 求符合给定条件的整数集

6. 求特殊方程的正整数解

7. 掉入陷阱的数字

8. 计算阶乘和

9. 统计MOOC证书

10. 查验身份证

11. 计算职工工资

12. 找出总分最高的学生

13. 矩阵运算

14. 找鞍点

15. 计算平均成绩


1. 求幂之和

计算sum=21+22+23+⋯+2n。可以调用pow函数求幂。

​输入格式:
输入在一行中给出正整数n(≤10)。

输出格式:
按照格式“result = 计算结果”输出。

输入样例:
5

输出样例:
result = 62

答案:

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int a=0,b;
    cin>>b;
    for(int i=1;i<=b;i++){
        a+=pow(2,i);
    }
    cout<<"result = "<<a;
}

2. 韩信点兵

在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

  • 按从1至5报数,记下最末一个士兵报的数为1;
  • 再按从1至6报数,记下最末一个士兵报的数为5;
  • 再按从1至7报数,记下最末一个士兵报的数为4;
  • 最后按从1至11报数,最末一个士兵报的数为10;
输入格式:
本题无输入

输出格式:
输出韩信至少拥有的士兵人数。

答案:

#include<iostream>
using namespace std;
int main(){
    int a;
    for(a=1;;a++){
        if((a%5==1)&&(a%6==5)&&(a%7==4)&&(a%11==10)){
            cout<<a;
        return 0;
        }
    }
}

3. 有理数比较

比较两个有理数的大小。

​输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:
在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”。

输入样例1:
1/2 3/4

输出样例1:
1/2 < 3/4

输入样例2:
6/8 3/4

输出样例2:
6/8 = 3/4

答案:

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int a,b,c,d;
    scanf("%d/%d %d/%d",&a,&b,&c,&d);
    if(a*d-b*c>0)printf("%d/%d > %d/%d",a,b,c,d);
    if(a*d-b*c<0)printf("%d/%d < %d/%d",a,b,c,d);
    if(a*d-b*c==0)printf("%d/%d = %d/%d",a,b,c,d);
    return 0;
}

4. 西安距离

小明来到了古都西安,想去参观大唐西市!西安的道路可以看做是与x轴或y轴垂直的直线,小明位于(a,b),而目的地位于(c,d),问最少几步可以到达。

​输入格式:
一行中四个整数,a,b,c,d,表示坐标为(a,b)与(c,d),这里0<=a,b,c,d<=1000

输出格式:
输出这两个点的西安距离。

输入样例:
0 0 3 4

输出样例:
7

答案:

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int a,b,c,d,x,y;
    cin>>a>>b>>c>>d;
    x=fabs(c-a);
    y=fabs(d-b);
    cout<<x+y;
}

5. 求符合给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

​输入格式:
输入在一行中给出A。

输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:
2

输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

答案:

#include<iostream>
using namespace std;

int main(){
    int a,b=0,c;cin>>a;
    for(int i=a;i<=a+3;i++){
        for(int j=a;j<=a+3;j++){
            for (int k=a;k<=a+3;k++){
                if(i!=j&&i!=k&&j!=k){
                    b++;
                    cout<<i*100+j*10+k;
                    if(b==6){
                        b=0;
                        cout<<"\n";
                    }else{
                    cout<<" ";
                    }
                }
            }
        }
    }
    return 0;
}

6. 求特殊方程的正整数解

对任意给定的正整数N,求方程X2+Y2=N的全部正整数解。

​输入格式:
输入在一行中给出正整数N(≤10000)。

输出格式:
输出方程X2+Y2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。

输入样例1:
884

输出样例1:
10 28
20 22

输入样例2:
11
输出样例2:
No Solution

答案:

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int a,b=0;cin>>a;
    for(int i=1;i<a;i++){
        for(int j=i;j<a;j++){
            if(i*i+j*j==a){
                b=1;
                cout<<i<<" "<<j<<endl;
            }
        }
    }
    if(b==0)cout<<"No Solution";
}

7. 掉入陷阱的数字

对任意一个自然数N0​,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N1​;然后对N1​重复这种操作,可以产生新自然数N2​;……多次重复这种操作,运算结果最终会得到一个固定不变的数Nk​,就像掉入一个数字“陷阱”。对输入的自然数,给出其掉入“陷阱”的过程。

​输入格式:
在一行内给出一个自然数N0​(N0​<30000)。

输出格式:
对于输入的N0​,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:Ni​ (i≥1)。当某一步得到的自然数结果Nk​(k≥1)与上一步Nk−1​相同时,停止输出。

输入样例:
5

输出样例:
1:16
2:22
3:13
4:13

答案:

#include<iostream>
#include<cstdio>

using namespace std;
int add(int a);
int main(){
    int a,b=0,c=0,d;cin>>a;
    while(a!=b){
        c++;
        b=add(a)*3+1;
        cout<<c<<":"<<b<<endl;
        if(a==b){
            break;
        }
        a=add(b)*3+1;
        c++;
        cout<<c<<":"<<a<<endl;
    }
    return 0;
}

int add(int a){
    int sum=0;
    int xin=0;
    while(a>0){
        xin=a%10;
        a=a/10;
        sum+=xin;
    }
    return sum;
}

8. 计算阶乘和

对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。

​输入格式:
输入在一行中给出一个不超过10的正整数N。

输出格式:
在一行中输出S的值。

输入样例:
3

输出样例:
9

答案:

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int a,b=1,c=0;cin>>a;
    for(int i=1;i<=a;i++){
        b=b*i;
        c+=b;
        }
    cout<<c;
}

9. 统计MOOC证书

输入N个学生的MOOC成绩,统计优秀、合格证书的数量,以及没有获得证书的数量。学生修读程序设计MOOC,85分及以上获得优秀证书,不到85分但是60分及以上获得合格证书,不到60分则没有证书。

​输入格式:
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:
在一行中依次输出优秀证书、合格证书、没有获得证书的数量,中间以空格分隔。请注意,最后一个数字后没有空格。

输入样例1:
7
85 59 86 60 84 61 45

输出样例1:
2 3 2

输入样例2:
4
91  100  88 75

输出样例2:
3 1 0

答案:

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int a,b=0,c=0,d=0,xin[1000];cin>>a;
    for(int i=0;i<a;i++){
        cin>>xin[i];
        if(xin[i]>=85){
            b++;
        }
        if((xin[i]<85)&&(xin[i]>=60)){
            c++;
        }
        if(xin[i]<60){
            d++;
        }
    }
    cout<<b<<" "<<c<<" "<<d;
}

10. 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

​输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。

输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1:
12010X198901011234
110108196711301866
37070419881216001X

输入样例2:
2
320124198808240056
110108196711301862

输出样例2:
All passed

答案:

#include<iostream>
#include<cstdio>
using namespace std;
int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int b[11]={1,0,10,9,8,7,6,5,4,3,2};
string s;
bool xin();
int main(){
    int n,m=0;cin>>n;
    for(int i=0;i<n;i++){
        cin>>s;
        if(!xin()){
            cout<<s<<endl;
            m=1;
        }
    }
    if(m==0)cout<<"All passed";
}

bool xin(){
    int sum=0;
    for(int i=0;i<17;i++){
        if(s[i]<'0'||s[i]>'9')return false;
        sum+=(s[i]-'0')*a[i];
    }
    int temp=(s[17]=='X')?10:(s[17]-'0');
    return b[sum%11]==temp;
}

11. 计算职工工资

给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。

​输入格式:
输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。

输出格式:
按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。

输入样例:
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80

输出样例:
zhao 565.00
qian 430.00
zhou 630.00

答案:

#include<iostream>
#include<cstdio>
#include<iomanip>
#define N 1000
using namespace std;
struct XIN{
    char name[16];
    double a;
    double b;
    double c;
    double d;
} xin[N];

int main(){
    int n;cin>>n;
    for(int i=0;i<n;i++){
        cin>>xin[i].name>>xin[i].a>>xin[i].b>>xin[i].c;
        xin[i].d=xin[i].a+xin[i].b-xin[i].c;
    }
    for(int i=0;i<n-1;i++){
        cout<<xin[i].name<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<xin[i].d<<endl;
    }
    cout<<xin[n-1].name<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<xin[n-1].d;
    return 0;
}

12. 找出总分最高的学生

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

​输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75

输出样例:
zhangfeng 10001 258

答案:

#include<iostream>
#include<cstdio>
#define N 100
using namespace std;
struct XIN{
    char h[10];
    char name[16];
    double a;
    double b;
    double c;
    double d;
}xin[N];

int main(){
    int n,m=0,l=0;cin>>n;
    for(int i=0;i<n;i++){
        cin>>xin[i].h>>xin[i].name>>xin[i].a>>xin[i].b>>xin[i].c;
        xin[i].d=xin[i].a+xin[i].b+xin[i].c;
        if(xin[i].d>m){
            m=xin[i].d;
            l=i;
        }
    }
    cout<<xin[l].name<<" "<<xin[l].h<<" "<<xin[l].d;
    return 0;
}

13. 矩阵运算

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

​输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1

输出样例:
35

答案:

#include<iostream>
#include<cstdio>

using namespace std;
int main()
{
    int a[11][11];
    int i,j,n,sum=0;
    cin>>n;
    for(i=0;i<n;i++)
    {   
        for(j=0;j<n;j++)
        {
            cin>>a[i][j];
            if(i==n-1||j==n-1||i+j==n-1)sum=sum+0;
            else sum=sum+a[i][j];
        }
    }
    cout<<sum<<endl;
    return 0;
}

14. 找鞍点

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。求一个给定的n阶方阵的鞍点。

​输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:
2 1

输入样例2:
2
1 7
4 1

输出样例2:
NONE

答案:

#include<iostream>
using namespace std;

int main()
{
    int n, m=0, p=0, flag=0, a[6][6], temp;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cin >> a[i][j];
        }
    }
    for(int i=0; i<n; i++)
    {
        temp = a[i][0];
        for(int j=1; j<n; j++)
        {
            if(temp <= a[i][j])
            {
                temp = a[i][j];
            }
        }
        for(int j=0; j<n; j++)
        {
            if(a[i][j] == temp)
            {
                m = i;
                p = j;
                for(int k=0; k<n; k++)
                {
                    if(k == i)
                    {
                        continue;
                    }
                    if(a[k][j] < a[i][j])
                    {
                        flag = 1;
                        break;
                    }
                }
                if(flag == 0)
                {
                    cout << m << " " << p << endl;
                    return 0;
                }
            }
            flag = 0;
        }
    }
    cout << "NONE" << endl;
    return 0;
}

15. 计算平均成绩

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。

​输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。

输出格式:
首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。

输入样例:
5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60

输出样例:
80.00
zhang 00001
chen 21987

答案:

#include<iostream>
#include<iomanip>
#include<cstdio>
#define N 100
using namespace std;
struct XIN{
    char h[10];
    char name[16];
    double a;
    double b;
}xin[N];

int main(){
    int n,x[1000],y=0,z;double m;cin>>n;
    for(int i=0;i<n;i++){
        cin>>xin[i].h>>xin[i].name>>xin[i].a;
        m+=xin[i].a;
    }
    m=m/n;
    printf("%.2f\n",m);
    for(int i=0;i<n;i++){
        if(xin[i].a<m){
            cout<<xin[i].name<<" "<<xin[i].h<<endl;
        }
    }
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到