PTA - C语言国庆题集1

目录

  • [7-1 阶梯电价](#7-1 阶梯电价)
  • [7-2 求矩阵的最大值(设惟一)](#7-2 求矩阵的最大值(设惟一))
  • [7-3 换硬币(鸡兔同笼)](#7-3 换硬币(鸡兔同笼))
  • [7-4 逆序输出一个整数的各位数字](#7-4 逆序输出一个整数的各位数字)
  • [7-5 交换最小值](#7-5 交换最小值)
  • [7-6 分段函数2](#7-6 分段函数2)
  • [7-7 数组中能被5整除的数的和](#7-7 数组中能被5整除的数的和)
  • [7-8 统计字母出现的次数(hash思想)](#7-8 统计字母出现的次数(hash思想))
  • [7-9 字母三角形](#7-9 字母三角形)
  • [7-10 简单求阶乘问题](#7-10 简单求阶乘问题)
  • [7-11 矩阵转置](#7-11 矩阵转置)
  • [7-12 输出所有大于平均值的数](#7-12 输出所有大于平均值的数)
  • [7-13 输出前n个英文大写字母](#7-13 输出前n个英文大写字母)
  • [7-14 删除字符串中指定字符(字符串读取)](#7-14 删除字符串中指定字符(字符串读取))
  • [7-15 特殊a串数列求和](#7-15 特殊a串数列求和)
  • [7-16 分段函数求值](#7-16 分段函数求值)
  • [7-17 二维数组处理(一)](#7-17 二维数组处理(一))
  • [7-18 数字金字塔(打印图形)](#7-18 数字金字塔(打印图形))
  • [7-19 二维数组处理(二)](#7-19 二维数组处理(二))
  • [7-20 字符转换](#7-20 字符转换)

7-1 阶梯电价

为了提倡居民节约用电,某省电力公司执行"阶梯电价",安装一户一表的居民用户电价分为两个"阶梯":月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

输入格式:

输入在一行中给出某用户的月用电量(单位:千瓦时)。

输出格式:

在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:"cost = 应付电费值";若用电量小于0,则输出"Invalid Value!"。

输入样例1:

c 复制代码
10

输出样例1:

c 复制代码
cost = 5.30

输入样例2:

c 复制代码
100

输出样例2:

c 复制代码
cost = 55.50
c 复制代码
#include <stdio.h>

int main(){
    int use;scanf("%d",&use);
    double ans=0;
    if(use<0) {
        printf("Invalid Value!\n");
        return 0;
    }
    else if(use<=50) {
        ans=use*0.53;
    }
    else ans=50*0.53+(use-50)*(0.53+0.05);

    printf("cost = %.2f",ans);
    return 0;
}

7-2 求矩阵的最大值(设惟一)

本题要求编写程序,求一个给定的m×n矩阵的最大值以及位置。题目保证最大值惟一。

输入格式:

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

输出格式:

输出在第一行中输出最大值,在第二行中按照"行下标 列下标"(下标从0开始)的格式输出最大值的位置。

输入样例:

c 复制代码
3 2
6 3 
23 -9
6 -1

输出样例:

c 复制代码
23
1 0
c 复制代码
#include <stdio.h>

int a[9][9];
int main(){
    int m,n;scanf("%d %d",&m,&n);
    for(int i=0;i<m;i++){
       for(int j=0;j<n;j++) scanf("%d",&a[i][j]);
    }
    int max=a[0][0],row=0,col=0;
    for(int i=0;i<m;i++){
       for(int j=0;j<n;j++) {
           if(a[i][j] > max) {
               max=a[i][j];
               row=i;
               col=j;
           }
       }
    }
    printf("%d\n",max);
    printf("%d %d",row,col);
    return 0;
}

7-3 换硬币(鸡兔同笼)

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:"fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量"。最后一行输出"count = 换法个数"。

输入样例:

c 复制代码
13

输出样例:

c 复制代码
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
c 复制代码
#include <stdio.h>

int main()
{
    int n;scanf("%d",&n);
    int cnt=0;
    for(int i_5=n/5;i_5>=1;i_5--){
        for(int i_2=n/2;i_2>=1;i_2--){
            int i_1=n-i_5*5-i_2*2;
            int total=i_1+i_2+i_5;
            if(i_1 > 0){
                printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i_5,i_2,i_1,total);
                    cnt++;
            }
    }
    }
    printf("count = %d",cnt);
    return 0;
}

7-4 逆序输出一个整数的各位数字

本题要求编写程序,对输入的一个非负整数,从低位开始逐位分割并输出它的各位数字。

输入格式:

输入在一行中给出一个长整型范围内的非负整数。

输出格式:

从低位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:

c 复制代码
1234560

输出样例:

c 复制代码
0 6 5 4 3 2 1 
c 复制代码
#include <stdio.h>

void Print(long long x){
    if(x==0) return; // 递归出口
    printf("%lld ",x%10);
    
    Print(x/10);// 递归
}
int main(){
    long long x;scanf("%lld",&x);
    if(x==0) {
        printf("0 ");
    }
    else Print(x);
    return 0;
}

7-5 交换最小值

本题要求编写程序,找出给定的N个数中的最小值,并将其与第一个数交换,最后输出交换后的序列。题目保证最小值是唯一的。

输入格式:

输入在第一行中给出一个正整数N(1≤n≤10),第二行给出N个整数,数字间以空格分隔。

输出格式:

在一行中顺序输出交换后的序列,每个整数后跟一个空格。

输入样例:

c 复制代码
5
8 2 5 1 4

输出样例:

c 复制代码
1 2 5 8 4 
c 复制代码
#include <stdio.h>

int a[19];
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    int min=a[0],minIndex=0;
    for(int i=1;i<n;i++){
        if(a[i]<min) {
            min=a[i];
            minIndex=i;
        }
    }
    int tmp=a[0];
    a[0]=a[minIndex];
    a[minIndex]=tmp;

    for(int i=0;i<n;i++) printf("%d ",a[i]);
    return 0;
}

7-6 分段函数2

计算分段函数,测试数据分别是-1、5、12。

输入格式:

输入一个数。

输出格式:

直接输出保留6位小数的结果,没有其它任何附加字符,没有宽度控制。

输入样例:

c 复制代码
11

输出样例:

c 复制代码
0.999912

输入样例:

c 复制代码
7

输出样例:

c 复制代码
8.000000
c 复制代码
#include <stdio.h>
#include <math.h>

double F(int x){
    if(x<0 && x!=-3)
        return x;
    else if(x>=0 && x<10 && x!=2 && x!=3)
        return x+1;
    else 
        return sin(3*x);
}
int main(){
    int x;scanf("%d",&x);
    double ans=F(x);
    printf("%.6f",ans);
    return 0;
}

7-7 数组中能被5整除的数的和

在一维数组中有10个整数,求出其中能被5整除的所有数的和。

输入格式:

在一行中输入10个整数,数据之间用1个空格间隔。

输出格式:

直接输出运算结果,没有任何附加字符。

输入样例:

c 复制代码
5 6 8 15 98 45 71 2 3 1

输出样例:

c 复制代码
65
c 复制代码
#include <stdio.h>

int a[11];
int main(){
    int ans=0;
    for(int i=0;i<10;i++){
        scanf("%d",&a[i]);
        if(a[i]%5==0) ans+=a[i];
    } 
    printf("%d",ans);
    return 0;
}

7-8 统计字母出现的次数(hash思想)

从键盘输入一行只有小写英文字母的字符串,用回车结束输入。统计26个英文字母出现的次数并依次输出。字符串长度不超过100个字符。

输入格式:

一行只有小写英文字母的字符串,用回车结束输入。

输出格式:

输出26行,按字典顺序输出26个小写英文字母和它们出现的次数。每个字母和它出现的次数占一行。字母和它出现的次数以一个空格隔开。

输入样例:

在这里给出一组输入。例如:

c 复制代码
aaaaabbbcccdddeeffgghhhhijkllmnnopqrstuvwxyyyyzz

输出样例:

在这里给出相应的输出。例如:

c 复制代码
a 5
b 3
c 3
d 3
e 2
f 2
g 2
h 4
i 1
j 1
k 1
l 2
m 1
n 2
o 1
p 1
q 1
r 1
s 1
t 1
u 1
v 1
w 1
x 1
y 4
z 2
c 复制代码
#include <stdio.h>
#include <string.h>

typedef struct Hash{
    char ch;
    int value;
}H;
char s[101];
int main()
{
    H h[29];
    // fgets(s,sizeof(s),stdin);
    scanf("%[^\n]",s);
    // 初始化hash表
    for(int i=0;i<26;i++){
        h[i].ch='a'+i;
        h[i].value=0;
    }
    
    for(int i=0;s[i]!='\0';i++)
        h[s[i]-'a'].value++;

    for(int i=0;i<26;i++) 
        printf("%c %d\n",h[i].ch,h[i].value);
    return 0;
}

7-9 字母三角形

从键盘输入n,输出n行的如下图形

a

ab

abc

abcd

abcde

...

...

输入格式:

从键盘输入一个正整数n,输入数据保证不大于26。

输出格式:

如题所述的图形。注意输出的字母之间没有空格。

输入样例1:

5

输出样例1:

a

ab

abc

abcd

abcde

输入样例2:

8

输出样例2:

a

ab

abc

abcd

abcde

abcdef

abcdefg

abcdefgh

c 复制代码
#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
            printf("%c",'a'+j);
        }
        printf("\n");
    }
    return 0;
}

7-10 简单求阶乘问题

本题要求编写程序,计算N的阶乘。

输入格式:

输入在一行中给出一个不超过12的正整数N。

输出格式:

在一行中输出阶乘的值。

输入样例:

4

输出样例:

24

c 复制代码
#include <stdio.h>

int Fac(int x){
    if(x==1) return 1;
    return x*Fac(x-1);
}
int main(){
    int n;scanf("%d",&n);
    int ans=Fac(n);
    printf("%d",ans);
    return 0;
}

7-11 矩阵转置

从键盘输入一个m(2<=m<=6)*n(2<=n<=6)阶的矩阵,编程输出它的转置矩阵。

输入格式:

在第一行输入矩阵的行数m和列数n的值,在第二行按照矩阵格式输入矩阵的数据,同行数据之间用空格隔开。

输出格式:

矩阵格式输出,同行数据之间用一个空格隔开。

输入样例:

3 5

1 2 3 4 5

1 2 3 4 5

1 2 3 4 5

输出样例:

1 1 1

2 2 2

3 3 3

4 4 4

5 5 5

c 复制代码
#include <stdio.h>

int a[9][9];
int main(){
    // m行n列
    int m,n;scanf("%d %d",&m,&n);
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++) scanf("%d",&a[i][j]);
    }
    // n行m列
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(j==m-1)
                printf("%d",a[j][i]);
            else printf("%d ",a[j][i]);
        }
        printf("\n");
    }
    return 0;
}

7-12 输出所有大于平均值的数

本题要求编写程序,将输入的n个整数存入数组a中,然后计算这些数的平均值,再输出所有大于平均值的数。

输入格式:

输入在第1行中给出一个正整数n(1≤n≤10),第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。

输出格式:

输出在第1行给出平均值,保留2位小数。在第2行输出所有大于平均值的数,每个数的后面有一个空格;如果没有满足条件的数,则输出空行。

如果输入的n不在有效范围内,则在一行中输出"Invalid."。

输入样例1:

10

55 23 8 11 22 89 0 -1 78 186

输出样例1:

47.10

55 89 78 186

输入样例2:

0

输出样例2:

Invalid.

c 复制代码
#include <stdio.h>

int a[11];
int main(){
    int n;scanf("%d",&n);
    if(n<1 || n>10){
        printf("Invalid.");
        return 0;
    }
    long long sum=0;double average=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    average=sum*1.0/n;
    printf("%.2lf\n",average);
    int flag=0;
    for(int i=0;i<n;i++)
    {
        if(a[i] > average) {
            printf("%d ",a[i]);
            flag=1;
        }
    }
    if(!flag) printf("\n");// 如果没有满足条件的数,则输出空行。
    return 0;
}

7-13 输出前n个英文大写字母

从键盘输入一个正整数n(我们约定输入的数不大于26)。输出前n个大写英文字母。

输入格式:

一个正整数n(我们约定输入的数不大于26)。

输出格式:

前n个大写英文字母。

注意:输出的每个字母之间没有空格,行末没有换行。

输入样例1:

3

输出样例1:

ABC

输入样例2:

5

输出样例2:

ABCDE

c 复制代码
#include <stdio.h>

int main()
{
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++) printf("%c",'A'+i);

  return 0;
}

7-14 删除字符串中指定字符(字符串读取)

删除字符串中的指定字符,字符串和要删除的字符均由键盘输入。

输入格式:

在第一行中输入一个长度不超过20的字符串、并以回车结束;在第二行中输入待删除的一个字符,并以回车结束。

输出格式:

在一行中输出删完指定字符的字符串。

输入样例:

abcdcf

c

输出样例:

abdf

c 复制代码
#include <stdio.h>
 
char s[29],ch;
int main()
{
    // 1.
    // fgets(s,sizeof(s),stdin);
    // scanf("%c",&ch);
    //2.
    // gets(s);
    // scanf("%c",&ch);
    // 3.
    scanf("%[^\n]",s);
    scanf(" %c",&ch);
    for(int i=0;s[i]!='\0';i++) {
        if(s[i]!=ch) 
            printf("%c",s[i]);
    }
  return 0;
}

使用fgets、gets读取字符串后,再读取其他数据,不需要使用getchar()读取缓冲区上的换行符;

使用scanf读取字符串后,再读取其他数据,读取时需要跳过缓冲区上的换行符;

7-15 特殊a串数列求和

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:

输入在一行中给出不超过9的正整数a和n。

输出格式:

在一行中按照"s = 对应的和"的格式输出。

输入样例:

2 3

输出样例:

s = 246

c 复制代码
#include <stdio.h>

int main()
{
    int a,n;scanf("%d %d",&a,&n);
    int ans=0,num=a;
    while(n--){
        ans+=num;
        num=num*10+a;
    }
    printf("s = %d",ans);
  return 0;
}

7-16 分段函数求值

编写程序,根据从键盘输入的x的值,输出y的值。x和y都是双精度浮点数,输出精确到小数点后3位。x与y的函数关系如下图所示:

输入格式:

输入是一个双精度浮点数。

输出格式:

输出是一个双精度浮点数,要求精确到小数点后3位。

输入样例:

在这里给出一组输入。例如:

3.1

输出样例:

在这里给出相应的输出。例如:

34.791

c 复制代码
#include <stdio.h>
int main(){
    double x,y;
    scanf("%lf",&x);
    if(x < 0)
        y=x*x+9;
    else
        y=x*x*x+5;
        
    printf("%.3f",y);
    return 0;
}

7-17 二维数组处理(一)

输入整型二维数组a(5行5列),完成如下要求:

输出二维数组a。

将a的第2行和第4行元素对调后,形成新的二维数组a并按行输出,每个元素之间隔一个空格。(行号从0开始计算)。

用对角线(指二维数组左上角到右下角的对角线)上的元素分别去除相应行的各元素,形成一个新的双精度型二维数组b并输出,每个输出占8列,输出到小数点后3位。

输入格式:

一个5行5列的整型二维数组

输出格式:

题目要求的各个输出

输入样例:

10 20 30 40 50

8 9 7 5 3

1 2 3 5 9

3 5 6 2 4

3 5 2 1 0

输出样例:

10 20 30 40 50

8 9 7 5 3

1 2 3 5 9

3 5 6 2 4

3 5 2 1 0

10 20 30 40 50

8 9 7 5 3

3 5 2 1 0

3 5 6 2 4

1 2 3 5 9

1.000 2.000 3.000 4.000 5.000

0.889 1.000 0.778 0.556 0.333

1.500 2.500 1.000 0.500 0.000

1.500 2.500 3.000 1.000 2.000

0.111 0.222 0.333 0.556 1.000

c 复制代码
#include <stdio.h>

void print(int a[][6],int x,int y){
    for(int i=0;i<x;i++){
        for(int j=0;j<y;j++) printf("%d ",a[i][j]);
        printf("\n");
    }
}

int a[6][6];
double ans[6][6];

int main()
{
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++) scanf("%d",&a[i][j]);
    }
    print(a,5,5);
    // 遍历第二行交换
    int p=2;
    for(int i=0;i<5;i++){
        int tmp=a[p][i];
        a[p][i]=a[p+2][i];
        a[p+2][i]=tmp;
    }
    print(a,5,5);

    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            ans[i][j]=a[i][j]*1.0/a[i][i];
        }
    }
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            printf("%8.3f",ans[i][j]);
        }
        printf("\n");
    }

    return 0;
}

7-18 数字金字塔(打印图形)

从键盘输入一个正整数n,输出n行的数字金字塔。输入保证 1 <= n <= 9。

输入格式:

从键盘输入一个正整数n,输入保证 1 <= n <= 9。

输出格式:

输出n行的数字金字塔。每个数字之间没有空格。

输入样例1:

5

输出样例1:

1

121

12321

1234321

123454321

输入样例2:

7

输出样例2:

1

121

12321

1234321

123454321

12345654321

1234567654321

c 复制代码
#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){// 行
        for(int k=0;k<n-i;k++) printf(" ");
        for(int j=1;j<=i;j++) printf("%d",j);
        for(int j=i-1;j>=1;j--) printf("%d",j);
        printf("\n");
    }
    return 0;
}

7-19 二维数组处理(二)

从键盘输入6行6列的双精度型二维数组。

(1)按行输出二维数组每个元素的值。

(2)将上三角形每个元素的值加1,下三角形每个元素的值减1,对角线元素不变。按行输出二维数组每个元素的值。

(3)求变化后数组的最大值,按输出示例输出最大值的行列号和最大值。输出格式如下:

The max is a[最大值的行下标][最大值的列下标] = 最大值

(4)用数组每个元素除以最大值,得到新的数组并输出。

输出格式要求:输出的每个浮点数占5列,输出到小数点后2位,右对齐。

输入格式:

双精度二维数组a(6行6列)

输出格式:

按题目要求输出

输入样例:

1 3 5 6 9 3

8 9 7 5 3 3

1 2 3 5 9 7

3 5 6 2 4 6

3 5 2 1 0 5

8 9 5 4 3 1

输出样例:

1.00 3.00 5.00 6.00 9.00 3.00

8.00 9.00 7.00 5.00 3.00 3.00

1.00 2.00 3.00 5.00 9.00 7.00

3.00 5.00 6.00 2.00 4.00 6.00

3.00 5.00 2.00 1.00 0.00 5.00

8.00 9.00 5.00 4.00 3.00 1.00

1.00 4.00 6.00 7.0010.00 4.00

7.00 9.00 8.00 6.00 4.00 4.00

0.00 1.00 3.00 6.0010.00 8.00

2.00 4.00 5.00 2.00 5.00 7.00

2.00 4.00 1.00 0.00 0.00 6.00

7.00 8.00 4.00 3.00 2.00 1.00

The max is a[0][4] = 10.00

0.10 0.40 0.60 0.70 1.00 0.40

0.70 0.90 0.80 0.60 0.40 0.40

0.00 0.10 0.30 0.60 1.00 0.80

0.20 0.40 0.50 0.20 0.50 0.70

0.20 0.40 0.10 0.00 0.00 0.60

0.70 0.80 0.40 0.30 0.20 0.10

c 复制代码
#include <stdio.h>

void print(double a[][6]) {
   for(int i=0;i<6;i++) {
       for(int j=0;j<6;j++) printf("%5.2f",a[i][j]);
       printf("\n");
   }
}
double a[6][6];
int main()
{
   for(int i=0;i<6;i++) {
       for(int j=0;j<6;j++) scanf("%lf",&a[i][j]);
   }
   print(a);
   // 
   for(int i=0;i<6;i++) {
       for(int j=0;j<6;j++){
           if(i<j) a[i][j]+=1;
           if(i>j) a[i][j]-=1;
       }
   }
   print(a);
   double max=a[0][0];
   int x_Index=0,y_Index=0;
   for(int i=0;i<6;i++) {
       for(int j=0;j<6;j++){
           if(a[i][j] > max){
               max=a[i][j];
               x_Index=i;
               y_Index=j;
           }
       }
   }
   printf("The max is a[%d][%d] = %.2f\n",x_Index,y_Index,max);
   for(int i=0;i<6;i++) {
       for(int j=0;j<6;j++){
           a[i][j]/=max;
       }
   }
   print(a);
   return 0;
}

7-20 字符转换

本题要求提取一个字符串中的所有数字字符('0'......'9'),将其转换为一个整数输出。

输入格式:

输入在一行中给出一个不超过80个字符且以回车结束的字符串。

输出格式:

在一行中输出转换后的整数。题目保证输出不超过长整型范围。

输入样例:

free82jeep5

输出样例:

825

c 复制代码
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

int main()
{
    char s[89];
    gets(s);
    int ans=0;
    for(int i=0;s[i]!='\0';i++) {
        if(isdigit(s[i])) ans=ans*10+s[i]-'0';
    }
    printf("%d",ans);
    return 0;
}
相关推荐
字节高级特工1 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白2 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
XH华7 小时前
初识C语言之二维数组(下)
c语言·算法
Uu_05kkq11 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
嵌入式科普13 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A13 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
1 9 J14 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
仍然探索未知中15 小时前
C语言经典100例
c语言
爱吃西瓜的小菜鸡15 小时前
【C语言】矩阵乘法
c语言·学习·算法
Stark、17 小时前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端