第一次作业 四班11
/*PTA3.3*/
1 #include<stdio.h> 2 int main() 3 { 4 int i; 5 scanf("%d",&i); 6 int a=i%10; 7 int b=i/10%10; 8 int c=i/100; 9 printf("%d",c+b*10+a*100); 10 return 0; 11 }
7-3 逆序的三位数
看到这道题之后,两种解决方案
一,如图
二,采用循环,算法类似第一种
方案一简单,不需要考虑太多,所以我采用此方案
方案一
1.对变量i赋值
2.将变量i对10取余,得到个位数,赋值给变量a
3.将变量i除10,再对10取余,得到十位数,赋值给变量b
4.将变量i除以100,得到百位数,赋值给变量c
5.为了避免出现当输入的数字含有结尾的0时,输出带有前导的0的情况(如输入230输出032,这显然不符合题目要求)
最终输出的结果采用加和的形式输出,c+b*10+a*100,这样就避免了当输入的数字含有结尾的0时,输出带有前导的0的情况
程序本身并不复杂,容易搞混的就是给个位数和百位数颠倒位置的时候容易颠倒,一开始我也搞颠倒了,
通过调试发现a和c的赋值颠倒了,调换过来之后PTA提交就通过了。其余的地方没有什么难点
流程图如下
/*PAT5.3*/
#include<stdio.h> int main() { int a,b; int exceed; scanf("%d %d",&a,&b); exceed=(double)(a-b)/b*100+0.5; if(exceed<10){ printf("OK\n"); } else if(exceed<50){ printf("Exceed %d%%. Ticket 200\n", exceed); } else { printf("Exceed %d%%. License Revoked\n", exceed); } return 0; }
7-3 高速公路超速处罚
看到这道题,显然Exceed的值是关键,求出Exceed的值之后进行一些判断就能解出此题
1.对变量a,变量b赋值
2.计算exceed的值,这里我用到了一个强制类型转换,否则的话当a-b<b的时候(a-b)/b会得0
但是需要注意,当a、b均为整形时,运算为求出不大于商的最大整数,所以加上0.5,目的是为了满足四舍五入
3.判断exceed是否小于10,若小于,则输出OK;若否,进入下一个判断
4.若exceed小于50则输出xceed %d%%. Ticket 200
5.若否,则输出Exceed %d%%. License Revoked
解题时,一开始忽略掉了计算exceed的值的时候(a-b)/b的问题,导致题目中给出案例输入进去之后得到了0,之后想到了强制类型转换,然后PTA的提交就通过了
流程图如下
关于学习中遇到的问题,最近来看的话,主要是数据类型的选用问题,很多时候忽略掉了程序在运行中会涉及到一数据类型转换,由于数据在计算机中存储的方式是二进制,这就导致了很多数据在存储的过程中数值会发生一些细小的变化导致程序运行的结果出错。
另外,在目前来看,数据类型的选择对程序本身的效率影响不大。但是从未来来看可能,这一点非常重要,良好的习惯对以后有着深远的影响,以51单片机举例,不同的数据类型对应不同的存储器,不同的存储器对应不同的地址,这将使将使程序的执行效率有很大影响。也就是说,为了节约cpu资源,提高程序效率,定义变量类型的时候要尽量使用小的数据类型。