PTA 基础编程题目集 编程题部分的7-1到7-19

PTA题目链接
7-20到7-38点击下文


函数题部分点击下文

7-1 厘米换算英尺英寸 (15分)

7-1 厘米换算英尺英寸 (15分)

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:

输入在一行中给出1个正整数,单位是厘米。

输出格式:

在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:

170

输出样例:

5 6
#include <stdio.h>
int main()
{
    int lm, f, i;
    scanf("%d", &lm);
    f = lm /100.0/0.3048;
    i = (lm / 100.0 / 0.3048 - f) * 12;
    printf("%d %d", f, i);
    return 0;
}

7-2 然后是几点 (15分)

7-2 然后是几点 (15分)

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

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

输入格式:

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

输出格式:

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

输入样例:

1120 110   

输出样例:

1310
#include "stdio.h"
int main()
{
    int t, a, sum,h,m,out;
    scanf("%d%d", &t, &a);
    sum = t / 100 * 60 + t % 100;//分钟数
    sum += a;//总分钟数
    h = sum / 60;//化小时
    m = sum - h * 60;//剩下分
    out = h * 100 + m;//组合
    printf("%d", out);
    return 0;
}

7-3 逆序的三位数 (10分)

7-3 逆序的三位数 (10分)

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出按位逆序的数。

输入样例:

123   

输出样例:

321
#include <stdio.h>
int main()
{
    int i,a,b[3];
    scanf("%d",&a);
    for(i=0;i<3;i++)
    {
        b[i]=a%10;
        a=a/10;
        if(b[i]==0)
            continue;
        printf("%d",b[i]);
    }
    return 0;
} 

7-4 BCD解密 (10分)

7-4 BCD解密 (10分)

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:

输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:

输出对应的十进制数。

输入样例:

18    

输出样例:

12
#include <stdio.h>
int main()
{
    int N;
    scanf("%d",&N);
    printf("%x",N);
    return 0;
} 

7-5 表格输出 (5分)

7-5 表格输出 (5分)

本题要求编写程序,按照规定格式输出表格。

输入格式:

本题目没有输入。

输出格式:

要求严格按照给出的格式输出下列表格:

------------------------------------
Province      Area(km2)   Pop.(10K)
------------------------------------
Anhui         139600.00   6461.00
Beijing        16410.54   1180.70
Chongqing      82400.00   3144.23
Shanghai        6340.50   1360.26
Zhejiang      101800.00   4894.00
------------------------------------
#include <stdio.h>
int main()
{
    printf("------------------------------------\n");
    printf("Province      Area(km2)   Pop.(10K)\n");
    printf("------------------------------------\n");
    printf("Anhui         139600.00   6461.00\n");
    printf("Beijing        16410.54   1180.70\n");
    printf("Chongqing      82400.00   3144.23\n");
    printf("Shanghai        6340.50   1360.26\n");
    printf("Zhejiang      101800.00   4894.00\n");
    printf("------------------------------------\n");
    return 0;
}

7-6 混合类型数据格式化输入 (5分)

7-6 混合类型数据格式化输入 (5分)

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:

2.12 88 c 4.7    

输出样例:

c 88 2.12 4.70
#include <stdio.h>
int main()
{
    float a, b;
    int c;
    char d;
    scanf("%f %d %c %f", &a, &c, &d, &b);
    printf("%c %d %.2f %.2f", d, c, a, b);
    return 0;
}

7-7 12-24小时制 (15分)

7-7 12-24小时制 (15分)

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

输入格式:

输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。

提示:scanf的格式字符串中加入:,让scanf来处理这个冒号。

输出格式:

在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM

输入样例:

21:11    

输出样例:

9:11 PM
#include<stdio.h>
int main()
{
    int a,b;
    scanf("%d:%d",&a,&b);
    if(a>12)
    {
        a-=12;
        printf("%d:%d PM",a,b);
    }
    else if(a==12)
    {
        printf("%d:%d PM",a,b);
    }
    else
        printf("%d:%d AM",a,b);
    return 0;
 } 

7-8 超速判断 (10分)

7-8 超速判断 (10分)

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。

输入格式:

输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。

输出格式:

在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK

输入样例1:

40    

输出样例1:

Speed: 40 - OK   

输入样例2:

75  

输出样例2:

Speed: 75 - Speeding
#include<stdio.h>
int main()
{
    int a=0;
    scanf("%d",&a);
    if(a>60)
        printf("Speed: %d - Speeding",a);
    else 
        printf("Speed: %d - OK",a);
    return 0;
 } 

7-9 用天平找小球 (10分)

7-9 用天平找小球 (10分)

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:

输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:

在一行中输出唯一的那个不一样的球。

输入样例:

1 1 2    

输出样例:

C
#include <stdio.h>
int main()
{
    int A,B,C;
    char D;
    scanf("%d%d%d",&A,&B,&C);
    if(A==B)
        D='C';
    else if(A==C)
        D='B';
    else
        D='A';
    printf("%c",D);
    return 0;
}

7-10 计算工资 (15分)

7-10 计算工资 (15分)

某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。

输入格式:

输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。

输出格式:

在一行输出该员工的周薪,精确到小数点后2位。

输入样例1:

5 40  

输出样例1:

2000.00  

输入样例2:

3 50  

输出样例2:

1650.00
#include "stdio.h"
int main()
{
    int y,t;
    float m;
    scanf("%d%d", &y, &t);
    if (y >= 5)
    {
        if (t <= 40)
            m = t * 50;
        else m = 40 * 50 + (t - 40) * 50 * 1.5;
    }
    else
    {
        if (t <= 40)
            m = t * 30;
        else m = 30 * 40 + (t - 40) * 30 * 1.5;
    }
    printf("%.2f", m);
    return 0;
}

7-11 分段计算居民水费 (10分)

7-11 分段计算居民水费 (10分)

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。

输入格式:

输入在一行中给出非负实数x

输出格式:

在一行输出应交的水费,精确到小数点后2位。

输入样例1:

12  

输出样例1:

16.00  

输入样例2:

16  

输出样例2:

22.50
#include <stdio.h>
int main()
{
    float x;
    scanf("%f", &x);
    if (x > 15)
        printf("%.2f", 2.5 * x - 17.5);
    else
        printf("%.2f", 4 * x / 3);
    return 0;
}

7-12 两个数的简单计算器 (10分)

7-12 两个数的简单计算器 (10分)

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

输入格式:

输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。

输出格式:

当运算符为+-*/%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR

输入样例1:

-7 / 2  

输出样例1:

-3  

输入样例2:

3 & 6  

输出样例2:

ERROR
#include "stdio.h"
int main()
{
    int  a, b;
    char c;
    scanf("%d %c %d", &a, &c, &b);
    if (c=='+')
        printf("%d", a + b);
    else if (c=='-')
        printf("%d", a - b);
    else if (c=='*')
        printf("%d", a * b);
    else if (c=='/')
        printf("%d", a / b);
    else if (c=='%')
        printf("%d", a % b);
    else
        printf("ERROR");
    return 0;
}

7-13 日K蜡烛图 (15分)

7-13 日K蜡烛图 (15分)

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。

如果Close<Open,表示为“BW-Solid”(即“实心蓝白蜡烛”);如果Close>Open,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。

输入格式:

输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。

输出格式:

在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow

输入样例1:

5.110 5.250 5.100 5.105  

输出样例1:

BW-Solid with Lower Shadow and Upper Shadow  

输入样例2:

5.110 5.110 5.110 5.110  

输出样例2:

R-Cross  

输入样例3:

5.110 5.125 5.112 5.126  

输出样例3:

R-Hollow
#include "stdio.h"
int main()
{
    float o,c,h,l;
    scanf("%f%f%f%f",&o,&h,&l,&c);
    if(c<o)
        printf("BW-Solid");
    else if(c>o)
        printf("R-Hollow");
    else
        printf("R-Cross");
    if((l<o&&l<c)&&(h>o&&h>c))
        printf(" with Lower Shadow and Upper Shadow");
      else if(l<o&&l<c)
          printf(" with Lower Shadow");
     else if(h>o&&h>c)
         printf(" with Upper Shadow");
    return 0;
}

7-14 求整数段和 (15分)

7-14 求整数段和 (15分)

给定两个整数AB,输出从AB的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数AB,其中−100≤AB≤100,其间以空格分隔。

输出格式:

首先顺序输出从AB的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X

输入样例:

-3 8 

输出样例:

   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30
#include "stdio.h"
int main()
{
    int a, b, sum,flog=0;
    scanf("%d%d", &a, &b);
    sum = (a + b) * (b - a + 1 ) / 2;
    for (int i = a; i <= b ;i++)
    {
        printf("%5d", i);
        flog++;
        if (flog % 5 == 0 && i != b)
            printf("\n");
    }
    printf("\n");
    printf("Sum = %d", sum);
    return 0;
}

7-15 计算圆周率 (15分)

根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。

2π=1+31+3×52!+3×5×73!+⋯+3×5×7×⋯×(2n+1)n!+⋯

输入格式:

输入在一行中给出小于1的阈值。

输出格式:

在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

输入样例:

0.01   

输出样例:

3.132157

题解

#include<stdio.h>
int main() {
    float a, pi = 1;
    float n = 1, m = 1, j = 1, i = 0;
    scanf("%f", &a);
    while (n / m >= a) 
    { 
        i++;
        j += 2;
        n = n * i;
        m = m * j; 
        pi += n / m;
    }
    pi = pi * 2;
    printf("%f", pi);
    return 0;
}

7-16 求符合给定条件的整数集 (15分)

7-16 求符合给定条件的整数集 (15分)

给定不超过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 "stdio.h"
int main()
{
    int a,flog=0;
    int g, s, b;//个位十位百位
    scanf("%d", &a);
    for (int i = 100; i < 1000; i++)
    {
        b = i / 100;
        s = i % 100 / 10;
        g = i % 100 % 10;
        if((g < a + 4 && g >= a)&&(s < a + 4 && s >= a)&&(b < a + 4 && b >= a))
            if (g != s && s != b && g != b)
            {    
                flog++;
                if(flog % 6 != 0)
                    printf("%d ", g + s * 10 + b * 100);
                if (flog % 6 == 0)
                    printf("%d\n", g + s * 10 + b * 100);    
            }
    }
    return 0;
}

7-17 爬动的蠕虫 (15分)

7-17 爬动的蠕虫 (15分)

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:

输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。

输出格式:

在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:

12 3 1   

输出样例:

11
#include <stdio.h>
int main()
{
    int N, U, D, time=0;
    scanf("%d%d%d", &N, &U, &D);
    while (1)
    {
        N = N - U;
        time++;
        if (N <= 0) break;
        N = N + D;
        time++;
    }
    printf("%d", time);
    return 0;
}

7-18 二分法求多项式单根 (20分)

7-18 二分法求多项式单根 (20分)

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。

本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a,b]内的根。

输入格式:

输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点ab。题目保证多项式在给定区间内存在唯一单根。

输出格式:

在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:

3 -1 -3 1
-0.5 0.5    

输出样例:

0.33

7-19 支票面额 (15分)

7-19 支票面额 (15分)

一个采购员去银行兑换一张yf分的支票,结果出纳员错给了fy分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:

输入在一行中给出小于100的正整数n

输出格式:

在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution

输入样例1:

23 

输出样例1:

25.51 

输入样例2:

22 

输出样例2:

No Solution

题解

#include<stdio.h>
int main() 
{
    int n, y, f, flog = 0;
    scanf("%d", &n);
    for (y = 0; y <= 100; y++) 
    {
        for (f = 0; f <= 100; f++) 
        {
            if ((2 * y * 100 + 2 * f + n) == (f * 100 + y)) 
            {
                printf("%d.%d", y, f);
                flog = 1;
            }
        }
    }
    if (flog == 0)
        printf("No Solution");
    return 0;
}

最后修改:2020 年 04 月 01 日 06 : 20 PM