浙大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+<
  • 3
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值