今天发现了一本不错的书
C语言大学实用教程,苏小红老师出版的书
在里面给出了容易出错的地方,总结了一下很有收获性,争取在尽快这本书看完
早上老师提出了一个问题10.0/33等于多少
这里首先因为是10.0/3,已经转换成浮点数了
所以这里10.0/3=3.33333
然后3.3333=9.99999
在c语言里面就转换成了10.0
今天从新看了一下龟兔赛跑的问题
7-12 龟兔赛跑 (20 分)
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出_,平局则输出--;后跟1空格,再输出胜利者跑完的距离。
先把代码打出来
#include<stdio.h>
int main()
{
int T, i;
int rabbitT=0;
scanf("%d",&T);
if(T<10)
{
printf("^_^ %d\n",T*9);
return 0;
}
rabbitT=10;
for(i=10;i<=T;i++)
{
if(i%10==0)
{
if(rabbitT*9>i*3 && (T-i)>=30)
i=i+29;
else if(rabbitT*9>i*3 && (T-i)<30)
{
i=T;
break;
}
else if(T-i>=10)
{
rabbitT+=10;
i=i+9;
}
else
{
rabbitT+=T-i;
i=T;
break;
}
}
}
if(i*3>rabbitT*9)
printf("@_@ %d\n",i*3);
else if(i*3<rabbitT*9)
printf("^_^ %d\n",rabbitT*9);
else
printf("-_- %d\n",rabbitT*9);
return 0;
}
这题与虫子向上爬有一定的相似之处,稍后会补充这道题的题我自己的思路;
首先是如果T<10因为他们刚开始所以兔子和乌龟都在跑
结果肯定是兔子赢
然后用一个循环,找出每十分钟
如果兔子比乌龟跑得远且时间还大于30分钟,则i=i+29,因为有i++所以这里只能加29
如果T-i<30分钟,则i=T
如果兔子在乌龟后面,且T-i>10,兔子就跑兔子时间+10
乌龟就+9同上面原理,然后进入下一个循环中
如果时间小于10时间相加后结束循环
7-2 计算火车运行时间 (15 分)
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
输入格式:
输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
输出格式:
在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。
#include <stdio.h>
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int a,b,c,d;
a=m/100;
b=m%100;
c=n/100;
d=n%100;
int x,y;
if(b<=d)
{
x=c-a;
y=d-b;
}
else
{
x=c-a-1;
y=60+d-b;
}
if(x<10)
{
printf("0%d:%d\n",x,y);
}
else if(y<10)
{
printf("%d:0%d\n",x,y);
}
else
{
printf("%d:%d\n",x,y);
}
return 0;
}
首先输入两个整数
m/100得到的是前两位数
m%100得到的是后两位数
如果后到达的时间的后两位大于出发的分钟数则直接相减
如果到达的时间的分钟数小于出发时的分钟数则向小时借1+60,进而小时数-1
如果他是两位数就直接输出,如果他不是两位数则在前面加0
7-3 然后是几点 (15 分)
有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式:
输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。
#include<stdio.h>
int main ()
{
int star,last,end,past,s,f;
scanf("%d%d",&star,&past);
s=star/100*60+star%100;
end=s+past;
f=end/60*100+end%60;
printf("%d",f);
return 0;
}
呃。。。。。。没啥好解释的
7-8 输出闰年 (15 分)
输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。
输入格式:
输入在一行中给出21世纪的某个截止年份。
输出格式:
逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。
#include<stdio.h>
int main()
{
int year, i, count=0;
scanf("%d", &year);
if(year<=2000||year>2100)
printf("Invalid year!\n");
else{
for(i=2001; i<=year; i++){
if(i%4==0&&i%100!=0||i%400==0){
printf("%d\n", i);
count++;
}
}
if(count==0)
printf("None\n");
}
return 0;
}
这里注意的是2000年还是20世纪
7-9 求一元二次方程的根 (20 分)
本题目要求一元二次方程的根,结果保留2位小数。
输入格式:
输入在一行中给出3个浮点系数a、b、c,中间用空格分开。
输出格式:
根据系数情况,输出不同结果:
1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
3)如果方程只有一个根,则直接输出此根;
4)如果系数都为0,则输出"Zero Equation";
5)如果a和b为0,c不为0,则输出"Not An Equation"。
#include <stdio.h>
#include<math.h>
#define EPSILON 1e-6
int main()
{
float a,b,c,p,m,n,delta, real, imaginary;
scanf("%f%f%f",&a,&b,&c);
p=b*b-4*a*c;
if(p>0&&a!=0)
{
m=(sqrt(p)-b)/2/a;
n=(-sqrt(p)-b)/2/a;
printf("%.2f\n%.2f",m,n);
}
else if(p==0&&a!=0)
printf("%.2f",-b/a/2);
else if(a==0&&b==0&&c==0)
printf("Zero Equation");
else if(a==0&&b==0&&c!=0)
printf("Not An Equation");
else if(a==0&&b!=0&&c!=0)
printf("%.2f",-c/b);
else if(a!=0&&p<0)
{
delta = b * b - 4 * a * c;
real = -b / (2 * a);
imaginary = sqrt(fabs(delta)) / (2 * a);
if(fabs(real) <= EPSILON) {
printf("0.00+%.2fi\n", imaginary);
printf("0.00-%.2fi\n", imaginary);
}
else {
printf("%.2f+%.2fi\n", real, imaginary);
printf("%.2f-%.2fi\n", real, imaginary);
}
}
return 0;
}
这里要注意在考虑的时候要考虑虚部为0的情况
还有几处问题稍后补充
7-13 大笨钟 (10 分)
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。
下面就请你写个程序,根据当前时间替大笨钟敲钟。
输入格式:
输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。
输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:
#include<stdio.h>
int main()
{
int m, n,h,i,k;
char c;
scanf("%d%c%d", &m, &c, &n);
if (m >= 13 && m < 24)
{
h = m - 12;
if (n != 0)
k = h + 1;
else if (n == 0)
k = h;
for (i = 0; i < k; i++)
{
printf("Dang");
}
}
else
printf("Only %02d:%02d. Too early to Dang.",m,n);
}
判断后两位是否等于0
如果不是0就+1
然后用循环输出Dang
7-15 谁是赢家 (10 分)
某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。
输入格式:
输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。
#include<stdio.h>
int main()
{
int Pa,Pb,a,b,c,count1=0,count2=0;
scanf("%d%d",&Pa,&Pb);
scanf("%d%d%d",&a,&b,&c);
if(a==0)
{
count1++;
}
else
{
count2++;
}
if(b==0)
{
count1++;
}
else
{
count2++;
}
if(c==0)
{
count1++;
}
else
{
count2++;
}
if(Pa>Pb&&count2!=3)
printf("The winner is a: %d + %d",Pa,count1);
else
printf("The winner is b: %d + %d",Pb,count2);
return 0;
}
呃。。。也没啥可以说的
最后补充一个题目
7-10 计算个人所得税 (10 分)
假设个人所得税为:税率×(工资−1600)。请编写程序计算应缴的所得税,其中税率定义为:
当工资不超过1600时,税率为0;
当工资在区间(1600, 2500]时,税率为5%;
当工资在区间(2500, 3500]时,税率为10%;
当工资在区间(3500, 4500]时,税率为15%;
当工资超过4500时,税率为20%。
输入格式:
输入在一行中给出非负工资。
输出格式:
在一行输出个人所得税,精确到小数点后2位。
#include<stdio.h>
int main()
{
int galary;
double money;
scanf("%d", &galary);
if (galary <= 1600)
money = 0;
else if (galary > 1600 && galary <= 2500)
money = (galary - 1600)*0.05;
else if (galary > 2500 && galary <= 3500)
money = (galary - 1600)*0.1;
else if (galary > 3500 && galary <= 4500)
money = (galary - 1600)*0.15;
else if (galary > 4500)
money = (galary - 1600)*0.2;
printf("%.2lf", money);
return 0;
}
本来是不用写的,后来同学给了一个神奇的代码,然后一时间我没有看出来什么问题
#include<stdio.h>
int main()
{
float s,l;
int m;
scanf("%d",&m);
if(m<=1600)
s=0;
else if(m>1600&&m<=2500)
s=0.05;
else if(m>2500&&m<=3500)
s=0.1;
else if(m>3500&&m<=4500)
s=0.15;
else if(m>4500)
s=0.2;
l=(m-1600)*s;
printf("%.2f",l);
return 0;
}
后来经过老师,学长指导发现,如果是m<1600,输出的结果是-0.00与答案不符,
在c语言中
如果是一个负数*0得到的答案就是-0,而不是0;