浙大PTA基础编程题目集(编程题)

本文列举了浙江大学在线测评系统PTA中的一系列基础编程题目,涵盖长度单位转换、时间计算、逆序数字、BCD解密、表格输出等,旨在提升编程者的算法思维和实践能力。
摘要由CSDN通过智能技术生成

7.1 厘米换算英尺英寸

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

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

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

输入样例:170
输出样例:
5 6

题目不难,唯一算是难点的地方在于:解答者容易陷入题目所给公式的误区里,总想着把公式倒过来便能解决。
正确的解题思路是:
让输入的厘米除以30.48,便是带小数的英尺,直接取整便是所得英尺。
将小数部分乘以12并取整,便为英寸

(foot+inch/12)×0.3048 单位米
(foot+inch/12)×0.3048x100 单位㎝

#include <stdio.h>
int main()
{
   
    /*1英尺等于12英寸  
    (foot+inch/12)×0.3048 == 英尺 * 0.3048  == meter
    即   英尺 == meter /0.3048;    
        而英尺又由两部分组成(foot+inch/12) 整数部分的foot 以及小数部分的 (inch/12) 
        所以 meter /0.3048 取整即为 foot
         meter /0.3048 - foot 即为小数部分 inch/12  即小数部分为 12 *(meter /0.3048 - foot); 
    */ 
    int cm=0;
    scanf("%d",&cm);    //输入的cm
    int foot = cm/100.0/0.3048;  /* 1英尺等于30.48厘米 */
    int inch = (cm/100.0/0.3048 - foot) * 12;
    printf("%d %d",foot,inch);
    return 0;
}

7.2 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数

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

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

输入样例:
1120 110

输出样例:
1310

#include<iostream>
using namespace std;
int main()
{
   
	int time,passtime;//注意passtime可能为负数 
	cin>>time>>passtime;
	int hour,minute;
	hour=time/100; //获取小时数 ,hour为最前两位 
	minute=time%100 ;//获取分钟数,分钟数为最后两位
	minute+=passtime;// minuet与add之和表示为:要增加多少分钟,或者是要减去多少分钟(add为负时)
	while(minute<0)	如果此时minute为负,则说明hour要-1,minute要+60,直到 minute>0,注意要有加有减 
	{
   
		hour--;
		minute+=60; 
	}
	while(minute)
	{
   
		if(minute>=60)//如果此时minute>=60,则说明hour要+1,minute要-60,直到 0<=minute<60 
		{
   
			hour++;
			minute-=60;	
		}
		else 
			break;
	}
	cout<<hour;	//hour可直接输出 
	//因为输出规定为4位,minute要分类讨论
	if(minute==0) 	//当minute==0时,补2个0 
	{
   
		cout<<"00"<<endl;
	}
	else if(minute<=9)
	{
   
		cout<<minute<<"0";
	}
	else 
		cout<<minute;
}

7.3 逆序的三位数

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

输入格式:
每个测试是一个3位的正整数.

输出格式:
输出按位逆序的数。

输入样例:
123

输出样例:
321

#include<iostream>
using namespace std;
int main()
{
   
	int n;
	cin>>n;
	int a,b,c;
	a=n/100;	
	b=n/10%10;
	c=n%100%10;
	cout<<100*c+10*b+a;
	
}

7-4 BCD解密

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
   
    int n;
    cin>>n;

    int a=n/16; //高位
    int b=n%16; //低位
    if(a==0&&b==0)cout<<0;
    else
    cout<<a<<b;
}

7.5 表格输出

没有一点技术含量,就是格式控制

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

7.6 混合类型数据格式化输入

在这里插入图片描述

直接输入输出就行,注意格式控制

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
   
	float a;
	int b;
	char c;
	float d;
	cin>>a>>b>>c>>d;
	cout<<c<<" "<<b<<" ";
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<a<<" ";
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<d;
	//c语言控制小数输出位数为printf("%c %d %.2f %.2f",c,b,a,d);
	return 0;
 } 

7.7 12-24小时制

在这里插入图片描述

注意刚好12点的情况,还有就是处理好输入的

调试输入测试样例的时候记得切换为英文模式,不然会出现蜜汁错误

//------------------------C++版-------------------------
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
   
	int hour,minute;
	char colon;
	cin>>hour>>colon>>minute;
	if(hour<12)//如果是上午,则不用转化时间,直接按格式输出即可
	{
   
		cout<< hour <<":"<< minute<<" AM"<<endl;//注意后面有一个空格 
	}
	else if(hour==12)//刚好是12点,注意这种情况
	{
   
		cout<< hour <<":"<< minute<<" PM"<<endl;
	}
	else//下午 
	{
   
		cout<<hour-12<<	":"<< minute<<" PM"<<endl;
	}
		 
 } 
//--------------------------C语言版-------------------
//直接在scanf的格式字符串中加入:,让scanf来处理这个冒号
#include<stdio.h>
int main() {
   
	int hour, minute;
	scanf("%d:%d", &hour, &minute);
	if (hour<12)  // 上午
	{
   
		printf("%d:%d AM", hour, minute);
	}
	else if(hour > 12) {
     // 下午
		hour = hour - 12;
		printf("%d:%d PM", hour, minute);
	}
	else {
     // 中午12点
		printf("%d:%d PM", hour, minute);
	}
	return 0;
}

7-8 超速判断

在这里插入图片描述

直接判断,注意输出要求就可以了。

#include<iostream>
using namespace std;
int main()
{
   
	int speed;
	cin>>speed;
	if(speed<=60)
	{
   
		cout<<"Speed: "<<speed<<" - OK"<<endl;
	 } 
	 else
	 cout<<"Speed: "<<speed<<" - Speeding"<<endl;
	
}
		 

7.9 用天平找小球

在这里插入图片描述

直接比较就可以,比两次就可以了,注意最后输出的不是重量,而是小球的标号

#include<iostream>
using namespace std;
int main()
{
   
	int A,B,C;	//3个小球的质量
	cin>>A>>B>>C;
	if(A==B)
	{
   
		cout<<"C"<<endl; 
	 } 
	 else if(B==C)
	 {
   
	 	cout<<"A"<<endl; 
	 }
	 else 
	 	cout<<"B"<<endl;
	return 0;
}
		 

7.10 计算工资

注意条件判断和输出控制即可

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
   
	int year,worktime;
	cin>>year>>worktime;
	double pay=0;
	int IsNew;		//判断是否为老员工
	if(year<5)
		IsNew=1;
	else IsNew=0;
	
	if(worktime<=40)
	{
   
		if(IsNew==1)
			{
   
				pay=worktime*30;
			}
			else
				pay=worktime*50;
	}
	else
		{
   
			if(IsNew==1)
			{
   
				pay=40*30+(worktime-40)*45;
			}
			else
				pay=40*50+(worktime-40)*75;
		}
	cout<<fixed<<setprecision(2)<<pay<<endl;
                     
	return 0;
}
		 

7.11 分段计算居民水费

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
   
	double x;
	cin>>x;
	double pay;
	if(x<15)
		pay=4*x/3;
	else
		pay=2.5*x-17.5;
	cout<<fixed<<setprecision(2)<<pay<<endl;
                     
	return 0;
}
		 

7.12 两个数的简单计算器

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
   
	int op1,op2;
	char sign;
	cin>>op1>>sign>>op2;
	if(sign=='+')
		cout<<op1+<
C语言参考答案汇总(浙江大学城市学院) 第2周(M2) 2 20011求华氏温度100°F对应的摄氏温度。 2 20012 求华氏温度 150°F 对应的摄氏温度。 3 20013求摄氏温度26°C对应的华氏温度。 3 20015当n为152时,分别求出n的个位字(digit1)、十位字(digit2)和百位字(digit3)的值。 3 20026 输入2个整 num1 和 num2,计算并输出它们的和、差、积、商与余。 4 第3周(M3) 5 20031 求1+2+3+......+100(调试示例error02_5) 5 20032 求m+(m+1)+(m+2)+......+100 5 20033 求1/m+1/(m+1)+1/(m+2)+......+1/n 6 20034 求1 + 1/3 + 1/5 + ......的前n项和 7 20035 求1-1/4+1/7-1/10+……的前n项之和 7 20036 输出华氏-摄氏温度转换表(改错题error02_6) 8 20038 求x的n次幂 9 20041 生成 3 的乘方表 10 20044 求100^0.5+101^0.5+……+1000^0.5 10 20053 计算物体自由下落的距离 11 20056 计算分段函 11 20061 阶梯电价 12 20062 求m*m+1/m+(m+1)*(m+1)+1/(m+1)+(m+2)*(m+2)+1/(m+2)+......+n*n+1/n 13 20063 求1-2/3+3/5-4/7+5/9-6/11+…… 14 20064 求2^1+2^2+2^3+……+2^n 15 第4周(M4) 15 10007 显示图案 (复习printf()的字符串输出) 15 20042 生成阶乘表 16 20043 使用函求 n! /(m!* (n-m)!) 16 20054 求平均值 17 20057 求1+1/2+1/3+......+1/n 18 20065 求0!+1!+2!+……+n! 18 40015 求最小值 19 40018 求a+aa+aaa+aa…a 20 第5周(M5) 21 30001 求一元二次方程的根 21 30002 求分段函的值 23 30003 分类统计字符 23 30004 显示五级记分制成绩所对应的百分制成绩区间(使用switch) 24 30005 显示水果的价格(使用switch) 25 30007 求三角形的面积和周长 27 30008 计算个人所得税 28 30051 判断闰年 29 30052 统计学生平均成绩与及格人 30 30053 分段计算水费(使用嵌套的if-else语句) 31 第6周(M6) 32 40011 求最小公倍和最大公约(调试示例error04_1) 32 40012 求1-1/4+1/7-1/10+1/13-1/16+…… 33 40014 求整的位 34 40023 换硬币 35 40024 找出各位字的立方和等于它本身的 36 40025 找完(改错题error04_2) 38 40027 从高位开始逐位输出一个的各位字(选作) 39 40052 判断素 40 40053 逆序输出整 41 40054 输出斐波那契序列 42 第7周(M7) 42 50002 使用函判断的符号 42 50003 使用函求奇和 43 50005 使用函统计素并求和 44 50006 使用函统计一个字的个 45 50007 使用函找水仙花 46 50009 使用函求余弦函的近似值 48 50052 使用函找最大值 49 50062 使用函输出指定范围内的 Fibonacci 50 50063 使用函找出指定范围内的完 51 第8周(M8) 52 40013 求奇和 52 40062 求x+x*x/2!+x*x*x/3!+x*x*x*x/4!+……的值 53 50004 使用函计算两点间的距离 54 50061 使用函求a+aa+aaa+aa…a 55 60002 整的十进制、八进制和十六进制表现形式 56 60003 分类统计字符 57 60006 验证歌德巴赫猜想 58 60007 使用函输出整的逆序 59 60009 统计单词 60 60062 简单计算器 61
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值