C语言程序设计专项练习——PTA

前言

本文仅用于分享解题思路和交流学习,请勿直接用于复制粘贴完成任务

如有代码错误欢迎评论区批评指出,欢迎友好学习交流。

部分代码有参考网络上搜索到的部分博客所写,非完全来自于本人,如有冒犯请及时联系删除。

为了保证题目的连续性,即使出现重复题目,只需要输出一串文字的没有营养的题,文中依旧会进行记录,望谅解。

也可根据题号方便进行搜索查询。

重庆科技学院给出的1—337题都会尽量一一更新

题目做完了才开始写这篇文章,如有代码疏漏错误无法通过测试欢迎指正

最新更新时间:2022/9/28,23:00

7-1 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:

输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:
1120 110
输出样例:
1310
#include <stdio.h>

int main() {
   // time——起始时间
   // change——流逝分钟数
   int time, hour, min, change;
   scanf("%d %d", &time, &change);
   hour = time / 100;
   min = time % 100;
   min += change;
   hour += min / 60;
   min %= 60;
   if (min < 0) {
       hour--;
       min += 60;
   }
   printf("%d%.2d", hour, min);
   return 0;
}

思路

- 通过单独对分钟数的加减运算后,再判断分钟数是否需要进位,如有负数则需要对小时进行对应减一操作

7-2 发奖金

某企业发放奖金,请你编写程序,帮助出纳员用最少的纸币发放奖金。其中奖金精确到元。
注:纸币面额为 100 元、50 元、20 元、10 元、5 元、2 元和 1 元。

输入格式

金额 (以元为单位,小于 10000 的整数)

输出格式

按钞票面额由大到小的顺序输出各种钞票的张数(参见输出样例)

输入样例
5382
输出样例
100元: 53张
 50元:  1张
 20元:  1张
 10元:  1张
  5元:  0张
  2元:  1张
  1元:  0张
#include <stdio.h>

int main(){
    int money;
    scanf("%d",&money);
    int yibai = money/100;
    money %= 100;
    int wushi = money/50;
    money %= 50;
    int ershi = money/20;
    money %= 20;
    int shi = money/10;
    money %= 10;
    int wu = money/5;
    money %= 5;
    int er = money/2;
    money %= 2;
    int yi = money;
    if(yibai>9){
        printf("100元: %d张\n",yibai);
        printf(" 50元:  %d张\n",wushi);
        printf(" 20元:  %d张\n",ershi);
        printf(" 10元:  %d张\n",shi);
        printf("  5元:  %d张\n",wu);
        printf("  2元:  %d张\n",er);
        printf("  1元:  %d张",yi);
    } else{
        printf("100元:  %d张\n",yibai);
        printf(" 50元:  %d张\n",wushi);
        printf(" 20元:  %d张\n",ershi);
        printf(" 10元:  %d张\n",shi);
        printf("  5元:  %d张\n",wu);
        printf("  2元:  %d张\n",er);
        printf("  1元:  %d张",yi);
    }
}

思路

- 依次计算出当前金额能拿到最大面值的张数,从大面额依次往小计算,每次计算后对金额进行对应减去
- 代码中,money/100表示能拿多少张一百元,拿完后,用money对100进行求模运算,得到拿走对应张数的一百元后
  还剩下的钱

7-3 推算星期

若告诉你今天是星期几,请问:过几天后是星期几?
请编写程序,输入今天的星期数 w 和所过的天数 n,计算并输出未来这一天的星期数 d

注:用整数值 0 ~ 6 表示星期日、星期一、… 、星期六。

星期
星期日0
星期一1
星期二2
星期三3
星期四4
星期五5
星期六6
输入格式

wn

输出格式

d

注:题目保证 wnd 的值都在 int 类型的表示范围内。

输入样例
3 100
输出样例
5
#include <stdio.h>

int main(){
    long w,n;
    long d;
    scanf("%ld %ld",&w,&n);
    d = (w+n)%7;
    printf("%ld",d);

}

思路

- 此题较为容易,只需要把当前星期几加上几天后模7就可以得到答案
- 需要注意本题的坑埋在题中“注”,w和n需要相加,题目只保证w,n在int范围内,却没有保证相加的结果在int范围
  所以此题想要全对,则需要把变量数据类型改为范围大于int类型的即可

7-4 逢7击掌

一群人围坐成一圈玩报数的游戏。游戏规则是:
从1开始报数,若遇到7的倍数或者个位为7的数则击掌代替,若犯错则要受罚。

可是这些人都太聪明了,竟然没人犯错!请问同样聪明的你,当报数到 n 时,总击掌次数 c 是多少?

输入格式

n

输出格式

c

输入样例
21
输出样例
4
#include <stdio.h>

int main(){
    int n,c;
    c = 0;
    scanf("%d",&n);
    c += (n/70)*16;
    n %=70; 
    for (int i = 1; i <= n; ++i) {
        if(i%7==0){
            c+=1;
        } else if(i%10==7){
            c+=1;
        }
    }
    printf("%d",c);
}

思路

- 此题方法笔者了解三种方法,文中代码只给出一种,其余两种方法读者可自行摸索
- 根据观察规律可知,每70个数字就需要击掌16次,我们只需要计算出有多少个70再对余下的数字
  依次进行求模取余运算即可得知答案
- 另外两种方法为:
  1.对每一个数字都采用求取模求余判断法
  2.计算出7的倍数的个数和个位为7的个数的和,再减去既是7的倍数个位数又是7的数字的个数

7-5 数油桶(简)

工人师傅将油桶码成如下图所示的梯形,数了数底层的油桶数和层数,就知道有多少油桶了。你知道他是怎么算的吗?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FodtLTdD-1664377675748)(https://images.ptausercontent.com/344)]

输入格式

底层油桶数和层数

输出格式

油桶的数量

输入样例
7 4
输出样例
22
#include <stdio.h>

int main(){
    int a,b;
    scanf("%d %d",&a,&b);
    int res = 0;
    for (int i = 0; i < b; ++i) {
        res +=a;
        a-=1;
    }
    printf("%d",res);
}

思路

- 题中所述层数即为,循环次数,底层油桶数即为第一个需要相加的数字,据图可知,每次减一
  所以采用文中所述的循环即可解决问题
- 根据~~小学二年级~~就学过的等差数列求和公式也可使用一条语句即可算出答案,具体公式请读者自行搜索

7-6 聪明的高斯(简)

著名德国数学家高斯(Gauss)上小学时,老师让大家计算:
1+2+3+4+⋯+100= ?

当大家都还在埋头做加法时,高斯却最先算出了答案。你知道他是怎么算的吗?

请编写程序,输入正整数 n,计算 s=1+2+3+4+⋯+n,输出 s 的值。

输入格式

n

输出格式

s

输入样例
100
输出样例
5050
#include <stdio.h>

int main(){
    int n;
    int res = 0;
    scanf("%d",&n);
    res = (1+n)*n/2;
    printf("%d",res);
    return 0;
}

思路

- 此题解法同上题,故不再赘述

7-7 快速求和

请编写程序,输入整数 n,快速计算:
题图.jpg

输入格式

n

输出格式

s

要求:输出 5 位小数,末位四舍五入。

输入样例1
4
输出样例1
0.80000
输入样例2
300
输出样例2
0.99668
#include <stdio.h>

int main(){
    double s=0,n;
    scanf("%lf",&n);
    s = 1.0-(1.0/(n+1));
    printf("%.5lf",s);

    return 0;
    }

思路

- 根据图中最后一项通项式子,采用循环求解即可
- 文中采用另一种数学公式求解,~~小学二年级~~就学过的的裂项相消法化简式子求得答案,具体请笔者自行搜索

7-8 买U盘

IT 协会举办程序设计竞赛,准备购买 U 盘作奖品。请编写程序,根据活动经费和 U 盘单价预估可购买 U 盘的最大数量。

输入格式

活动经费和 U 盘单价

输出格式

可购买 U 盘的最大数量

输入样例1
807.5 47.5
输出样例1
17
输入样例2
514.7 19.8
输出样例2
25
#include <stdio.h>

int main(){
    double m,n;
    scanf("%lf %lf",&m,&n);
    int res = m/n;
    printf("%d",res);
    return 0;
}

思路

- 本题采用~~胎教~~就学过的 价格 = 单价 * 数量 该公式可知
- 即 数量 = 价格 / 单价,如有小数int类型自动转换为整数,省去小数部分

7-9 买复印纸

某办公室到年底准备将剩余的办公经费全部用于购买复印纸。请编写程序,输入办公经费的余额和每包复印纸的单价,计算并输出最多可购买多少包复印纸。

输入格式

办公经费的余额和每包复印纸的单价

输出格式

可购复印纸的最大数量

输入样例1
611.2 38.2
输出样例1
16
输入样例2
1369.2 23.4
输出样例2
58
#include <stdio.h>

int main(){
    double m,n;
    scanf("%lf %lf",&m,&n);
    int res = m/n;
    printf("%d",res);
    return 0;
}

思路

- 据上题思路可知求解过程

7-10 黑白三子棋局

编写程序,输出下面的黑白三子棋的棋局。

输入样例

注:无输入。

输出样例
┏━┯━┯━┓
┃○│  │○┃
┠─┼─┼─┨
┃  │○│●┃
┠─┼─┼─┨
┃●│●│  ┃
┗━┷━┷━┛

注:外框是粗线,内部是细线。棋盘中的空白处是西文空格。

实际显示效果如下:

棋盘.jpg


提示:如果你使用的是 Windows 7/8/10 操作系统,需要对运行窗口进行设置。

  • 用鼠标右键点击窗口标题栏,选择“属性”
  • 切换到“选项”卡片,选择“使用旧版控制台”
  • 切换到“字体”卡片,字体选择“点阵字体”,大小选择“8×16”
  • 点击“确定”按钮
#include <stdio.h>

int main(){
    printf("┏━┯━┯━┓\n"
           "┃○│  │○┃\n"
           "┠─┼─┼─┨\n"
           "┃  │○│●┃\n"
           "┠─┼─┼─┨\n"
           "┃●│●│  ┃\n"
           "┗━┷━┷━┛");
}

思路

- 直接输出即可
- 不太明白此题用意,滥竽充数,没有营养的题大可不必出现在题库中

7-12 打妖怪

话说孙大圣保唐僧西天取经,路上遇到一妖怪。妖怪共有 v 滴血,大圣每打一棒就能使妖怪失去 h 滴血,妖怪一旦没血就会立即死去。大圣打了 n 棒将妖怪打死。
请编写程序,输入 vh,输出 n

输入格式

vh

输出格式

n

注:题目保证 abn 的值都在 int 类型的表示范围内。

输入样例
2510 1000
输出样例
3
#include <stdio.h>

int main(){
    int v,h;
    scanf("%d %d",&v,&h);
    if(v%h==0){
        printf("%d",v/h);
    } else{
        printf("%d",v/h+1);
    }
    return 0;
}

思路

- 只需要通过求余数为0来判断血量是否为伤害的倍数,如果不是则需要整除后+1就行

7-14 十六进制转十进制

请编写程序,输入十六进制数,输出对应的十进制数。

输入格式

十六进制非负整数

输出格式

对应的十进制非负整数

输入样例
13Ba
输出样例
5050
#include <stdio.h>

int main(){
    long n;
    scanf("%lx",&n);
    printf("%ld",n);
}

思路

- 此题只需要怎么输入怎么输出就行,这样也能满足题意
- 还可以把输入值存入数组,从低位开始使用位权法求值

7-15 十进制转十六进制

请编写程序,输入十进制数,输出对应的十六进制数。

输入格式

十进制非负整数

输出格式

对应的十六进制非负整数

要求:十六进制数中的字母均为大写形式。

输入样例
5050
输出样例
13BA
#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    printf("%X",n);
}

思路

- 本题解法和上题同理类似

7-16 旅游派车

某企业组织 n 名职工春游,每辆旅游车可容纳 b 名乘客,需要 k 辆旅游车。请你编写程序,帮助工作人员计算需要派多少辆车。

输入格式

nb

输出格式

k

输入样例
85 36
输出样例
3
#include <stdio.h>

int main(){
    int v,h;
    scanf("%d %d",&v,&h);
    if(v%h==0){
        printf("%d",v/h);
    } else{
        printf("%d",v/h+1);
    }
    return 0;
}

思路

- 同题7-12打怪同理

7-17 直角坐标->极坐标

请编写程序,输入直角坐标 ( x,y ),输出对应的极坐标 ( r,θ )。

输入格式

( x,y )

输出格式

( r,θ )

注:θ 的单位为弧度,且 −π<θπ

要求:rθ 输出10位有效数字,不输出小数末尾多余的零和小数点。

输入样例1
( -1.29903810567665797, 0.75 )
输出样例1
( 1.5, 2.617993878 )
输入样例2
( -2, -3.4641016151377546 )
输出样例2
( 4, -2.094395102 )
#include <stdio.h>
#include <math.h>

#define PI 3.1415926535

int main() {
    double x,y,r,o;
    scanf("( %lf,%lf )",&x,&y);
    r = sqrt(x*x+y*y);
    o = atan2(y,x);
    printf("( %.10g, %.10g )",r,o);
    return 0;

}

思路

- 题目对编程能力几乎没有考察,只需要了解一点math头文件的函数即可
- 同时还需要对两种坐标转换方法有一定掌握,具体方法请读者自行百度。

7-18 花生换核桃

小松鼠有很多花生,小熊有很多核桃。小松鼠想找小熊换核桃:每 9 颗花生换回 2 颗核桃。
请帮小松鼠算算最多能换得多少核桃?

输入格式

花生数

输出格式

核桃数

注:题目保证所有值都在 int 类型的表示范围内。

输入样例
50
输出样例
10
#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    printf("%d",(n/9)*2);
    return 0;
}

思路

- 只需要求出有多少个9即,n/9,结果乘2得出答案

7-19 装酒

已知酒瓶容量为 b 升,现有 w 升酒,需要 n 只瓶子才能盛下全部这些酒。请编写程序,输入 pt,计算并输出 n

输入格式

bw

输出格式

n

样例输入1
9.45 85.05
样例输出1
9
样例输入2
0.85 146.6
样例输出2
173
#include <stdio.h>
#include <math.h>

int main(){
    double b,w;
    scanf("%lf %lf",&b,&w);
    if(fmod(w,b) < 0.00001){
        printf("%d",(int)(w/b));
    }else{
        printf("%d",(int)(w/b)+1);
    }
}


思路

- 本题坑点在于判断浮点数是否为0,以及取余不能直接用%,需要使用math
  头文件的fmod函数,具体解法和同题7-12打怪同理

7-20 学分差

本学期小张完成了 z 个学分,小王完成了 w 个学分,两人相差 s 个学分。
请编写程序,输入 zw,计算并输出 s

输入格式

zw

输出格式

s

输入样例1
17 23
输出样例1
6
输入样例2
25 21
输出样例2
4
#include <stdio.h>
#include <math.h>

int main(){
    int z, w, s;
    scanf("%d %d", &z, &w);
    s = abs(w - z);
    printf("%d",s);

}

思路

- 两种解法,if判断是否小于0,然后负号取反即可
- 另一种方法使用abs函数即可

7-21 三角形面积

请编写程序,输入三角形的底 b 和高 h,计算并输出三角形的面积 a

输入格式

bh

输出格式

a

输入样例
19.77 48.36
输出样例
478.04
#include <stdio.h>

int main(){
    double b,h;
    scanf("%lf %lf",&b,&h);
    printf("%.2lf",b*h/2);
}

思路

- 底乘高除2,输出即可

7-22 求序列平方和

请编写程序,输入正整数 n,计算平方和 s=12+22+32+⋯+n2。

输入格式

整数 n

注:n 在 int 类型范围内,格式限定符采用 %d。

输出格式

实数 s

注:s 在 double 类型范围内,格式限定符采用 %.15g。

输入样例
100
输出样例
338350
#include <stdio.h>

int main(){
    double n;
    double s=0;
    scanf("%lf",&n);
    s += (n*(n+1)*(2*n+1))/6;
    printf("%.15g",s);
}

思路

- 直接使用数列求和公式即可,循环可能导致超时,使用公式的时间复杂度为O(1)

7-23 求序列立方和

编写程序,输入正整数 n,计算立方和 s=13+23+33+⋯+n3。

输入格式

整数 n

注:n 在 int 类型范围内,格式限定符采用 %d。

输出格式

实数 s

注:s 在 double 类型范围内,格式限定符采用 %.15g。

输入样例
40
输出样例
672400
#include <stdio.h>

int main(){
    double n;
    double s=0;
    scanf("%lf",&n);
    s += (n*n*n*n+2*n*n*n+n*n)/4;
    printf("%.15g",s);
}

思路

- 见上题

7-24 书香节

当当网每年书香节都推出购书优惠活动:每满100元就减50元。请编写程序,输入你购书的金额,计算并输出可减金额和付款金额。

输入格式

购书金额

输出格式

可减金额
付款金额

样例输入1
228.76
样例输出1
100.00
128.76
样例输入2
1000.0
样例输出2
500.00
500.00

注:所有金额都为2位小数。

#include <stdio.h>

int main(){
   double x,y;
   scanf("%lf",&x);
   y = (long)(x/100)*50;
   printf("%.2lf\n",y);
   printf("%.2lf",x-y);
}

思路

- 求出多少个100乘50得可减金额
- 总价减去可减金额得付款金额

7-25 买U盘(误差修正版)

IT 协会举办程序设计竞赛,准备购买 U 盘作奖品。请编写程序,根据活动经费和 U 盘单价预估可购买 U 盘的最大数量。

输入格式

活动经费和 U 盘单价

输出格式

可购买 U 盘的最大数量

输入样例
660.8 47.2
输出样例
14
输入样例2
504.9 19.8
输出样例2
25

要求:考虑实数的误差。

#include <stdio.h>

int main(){
    double m,n;
    scanf("%lf %lf",&m,&n);
    int res = m/n+0.000001;
    printf("%d",res);
    return 0;
}

思路

- 这题有点恶心人了,有些测试点会m/n得到一个小数位为类似于.99999的情况,但又会被int类型转换,导致精度损失
  故需要加上0.000001来避免误差

7-26 聪明的高斯

著名德国数学家高斯(Gauss)上小学时,老师让大家计算:

1+2+3+4+⋯+100= ?

当大家都还在埋头做加法时,高斯却最先算出了答案。你知道他是怎么算的吗?

请编写程序,输入正整数 n,计算 s=1+2+3+4+⋯+n,输出 s 的值。

输入格式

n

输出格式

s

输入样例
100000
输出样例
5000050000

提示:本题要使用 long long int 类型。

#include <stdio.h>

int main(){
    long long int x,r;
    scanf("%lld",&x);
    r = (x*(x+1))/2;
    printf("%lld",r);
}

思路

- 直接上公式,代入即可

7-27 狐狸说葡萄是酸的

请编写程序,输出下面的文字:

The fox says, "I am sure that these grapes are sour."

狐狸吃不到葡萄,就说葡萄是酸的。

输入样例

注:无输入

输出样例
The fox says, "I am sure that these grapes are sour."
#include <stdio.h>

int main(){
    printf("The fox says, \"I am sure that these grapes are sour.\"");
}

思路

- 直接输出吧😒

7-28 何时空仓

某仓库现存货物 s 箱,每天上午出货 m 箱、下午进货 n 箱,若sm>n≥0,则第 k 天将会出现空仓的情况。请你帮仓库管理员编写程序,输入smn,计算并输出 k

输入格式

s,m,n (sm>n≥0)

输出格式

k

输入样例
4705 268 193
输出样例
61
#include <stdio.h>

int main(){
    int s,m,n,k=0;
    scanf("%d %d %d",&s,&m,&n);
    while (s>0){
        k++;
        s-=m;
        if(s<=0){
            break;
        }
        s+=n;
    }
    printf("%d",k);
    return 0;
}

思路

- 空仓即s<=0,故设循环条件为s>0,当s<=0时空仓就结束循环
- 每循环一次k自增表示天数加一
- 每天库存减m表示出货后剩余量
- 但如果当进货前s已经满足条件表示当天已经空仓结束循环输出k(天数)即可

7-29 烟囱的高度

已知人离烟囱的距离为 a,人的眼睛离地高度为 b,人看烟囱顶时的仰角为 θ,求烟囱的高度 h

题图.png

输入格式

a b θ

注:ab 的单位为米,均为小数。仰角 θ 的单位为角度,包括度、分和秒数,其中度、分为整数,秒数为小数。

输出格式

h

注:h 的单位为米。

要求:输出2位小数,末位四舍五入。

输入样例
27.8 1.2 32 48 59.5
输出样例
19.13
#include <stdio.h>
#include <math.h>

#define PI 3.14159265

int main() {
    double a, b, sec, angle,h;
    int degree, min;
    scanf("%lf %lf %d %d %lf", &a, &b, &degree, &min, &sec);

    // 度数转换
    angle = degree + (double)min / 60.0 + sec / 60.0 / 60.0;
    // 角度转弧度
    angle = angle * PI / 180.0;
    //计算
    h = b + tan(angle)*a;

    printf("%.2lf",h);


    return 0;
}

思路

- 数学题,注释已经写清楚了,唯一需要了解的就是tan函数的参数是弧度制
- 此题需要将角度转弧度有一定麻烦

7-30 求矩形面积

已知一个矩形的长和宽,计算该矩形的面积。矩形的长和宽用整数表示,由键盘输入。

输入格式:

输入在一行中给出2个绝对值不超过1000的整数A和B,表示矩形的长和宽。

输出格式:

在一行中输出矩形的面积。

输入样例:
4 3
输出样例:
12
#include <stdio.h>

int main(){
    long x,y;
    scanf("%ld %ld",&x,&y);
    printf("%ld",x*y);
}

思路

- 额,直接长乘宽,为了防止超出范围,用long保险一点

后面题目见专栏吧,一篇写太多了不便于查找!!!

https://blog.csdn.net/qq_57745001/category_12033419.html

  • 13
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Likf(❁´◡`❁)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值