PTA - C语言国庆题集1

7-1 阶梯电价

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

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

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

输入样例1:

10

输出样例1:

cost = 5.30

输入样例2:

100

输出样例2:

cost = 55.50
#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开始)的格式输出最大值的位置。

输入样例:

3 2
6 3 
23 -9
6 -1

输出样例:

23
1 0
#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 = 换法个数”。

输入样例:

13

输出样例:

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
#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 逆序输出一个整数的各位数字

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

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

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

输入样例:

1234560

输出样例:

0 6 5 4 3 2 1 
#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个整数,数字间以空格分隔。

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

输入样例:

5
8 2 5 1 4

输出样例:

1 2 5 8 4 
#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。
函数f(x)
输入格式:
输入一个数。

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

输入样例:

11

输出样例:

0.999912

输入样例:

7

输出样例:

8.000000
#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个空格间隔。

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

输入样例:

5 6 8 15 98 45 71 2 3 1

输出样例:

65
#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个小写英文字母和它们出现的次数。每个字母和它出现的次数占一行。字母和它出现的次数以一个空格隔开。

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

aaaaabbbcccdddeeffgghhhhijkllmnnopqrstuvwxyyyyzz

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

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
#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

#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

#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

#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.

#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

#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

#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

#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的函数关系如下图所示:
f(x)
输入格式:
输入是一个双精度浮点数。

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

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

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

34.791

#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

#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

#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

#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

#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;
}
  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值