交换变量。定义两个变量 a 和 b 并输入两个数字存储进它们。交换这两个变量的值并输出。
建模分析:
交换两个变量,需要有第三个变量 c 做临时存放地点。先将 a 给 c,然后将 b 给 a,最后将 c 给 b,完成交换。
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin>>a>>b;
c=a;
a=b;
b=c;
cout<<a<<‘ ‘<<b;
return 0;
}
C语言版:
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=a;
a=b;
b=c;
printf("%d %d",a,b);
return 0;
}
因为题目说明变量是数字,那么则可以利用数字的特性,进行加减来交换值。可以不用第三个变量c。
#include<iostream>
using namespace std;
int main()
{
int a,b;
scanf("%d %d",&a,&b);
a=a+b;
b=a-b;
a=a-b;
printf("%d %d",a,b);
return 0;
}
小鱼的游泳时间(洛谷P1425)
伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。
这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自己从a时b分一直游泳到当天的c时d分,请你帮小鱼计算一下,它这天一共游了多少时间呢?
小鱼游的好辛苦呀,你可不要算错了哦。
一行内输入 4 个整数,分别表示 a, b, c, d。
一行内输出 2 个整数 e 和 f,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 f 应该小于60。
输入 | 输出 |
---|---|
12 50 19 10 |
6 20 |
建模分析:
首先,0 <= a <=24,0 <= c <= 24,0 <= b <=60,0 <= d <=60,弄明白了时间是60进的。就将小时转化成分钟数。用分钟数计算后再换成小时和分钟就可以了。
#include<cstdio>
using namespace std;
int main()
{
int a,b,c,d,e,f,delta;
scanf("%d%d%d%d",&a,&b,&c,&d);
delta=(60*c+d)-(60*a+b);
e=delta/60;
f=delta%60;
printf("%d %d",e,f);
return 0;
}
因为 c 一定 大于 a,所以也可以直接得出结果。
#include<iostream>
using namespace std;
int a,b,c,d,e,f;
int main()
{
cin>>a>>b>>c>>d;
e=c-a;
if(b>d)
{
e=e-1;
f=60-b+d;
}
else
f=d-b;
cout<<e<<" "<<f;
}
成绩(洛谷P3954,NOIP 2017 普及组)
牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是:
总成绩=作业成绩×20%+小测成绩×30%+期末考试成绩×50%
牛牛想知道,这门课程自己最终能得到多少分。
三个非负整数A,B,C,分别表示牛牛的作业成绩、小测成绩和期末考试成绩。相邻两个数之间用一个空格隔开,三项成绩满分都是100分。
一个整数,即牛牛这门课程的总成绩,满分也是100100分。
输入 | 输出 |
---|---|
100 100 80 |
90 |
60 90 80 |
79 |
建模分析:
输入输出样例1说明
牛牛的作业成绩是100分,小测成绩是100分,期末考试成绩是80分,总成绩是 100×20%+100×30%+80×50%=20+30+40=90。
输入输出样例2说明
牛牛的作业成绩是60分,小测成绩是90分,期末考试成绩是80分,总成绩是60×20%+90×30%+80×50%=12+27+40=79。
对于30%的数据,A=B=0。
对于另外30%的数据,A=B=100。
对于100%的数据,0≤A,B,C≤100且A,B,C都是10的整数倍。
#include<cstdio>
using namespace std;
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d",int(a*0.2 + b*0.3 + c*0.5 + 0.5)); //因为int是向下取整,所以需要加0.5,这样就可以保证是四舍五入。
return 0;
}
因为数据保证是10的倍数,因为浮点数计算容易出现误差,可能会出现类似 78.99999999 这样的数字。为了避免进行浮点类型的运算,采用整数进行运算。
#include<cstdio>
using namespace std;
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d",a*2/10 + b*3/10 + c*5/10); //因为int是向下取整,所以需要加0.5,这样就可以保证是四舍五入。
return 0;
}
yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s≤10000) 米,而 yyy 可以以 v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。
两个正整数 s,v,意思已经在题目中给定。
hh:mm 表示最晚离开家的时间(时:分,必须输出两位,不足两位前面补0)
输入 | 输出 |
---|---|
100 99 |
07:48 |
建模分析:
解答:
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
int s,v,needmins,hh,mm;
cin>>s>>v;
needmins=s/v;
if(s%v>0)
needmins++;
needmins+=10;
hh=needmins/60;
mm=needmins%60;
if(hh<8)
{
hh=8-hh-1; //花费0小时从7时出发
if(mm>0)
mm=60-mm;
}
else
{
hh=24-(hh-8+1); //花费8小时从23时出发
if(mm>0)
mm=60-mm;
}
cout<<setw(2)<<setfill(‘0‘)<<hh;
cout<<‘:‘;
cout<<setw(2)<<setfill(‘0‘)<<mm;
return 0;
}
技能:
setw(2)
指定输出宽度为2个字符,如果不足则默认用空格补齐。
setfill(‘0‘)
用指定字符替换默认补全字符空格,这里指定用‘0‘补全。
因为时间不会提前超过一天,那么我知道话费时间后,就可以先计算出从前一天 0 点到今天 8 有多少时间(分钟),然后将这个时间减去 需要花费的时间,就是需要的结果。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int s,v;
scanf("%d%d",&s,&v);
int t_walk=ceil(1.0*s/v)+10;
int from_zero=60*(24+8)-t_walk;
int hh=(from_zero/60)%24;
int mm=from_zero%60;
printf("%02d:%02d\n",hh,mm);
return 0;
}
技能:
ceil
向上取整。
eg. ceil(3)
=3
、ceil(2.8)
= 3
、ceil(2.1)
= 3
。
%02d
的是用输出至少 2 位的整数,不足部分用 ‘0‘ 补齐。
原文:https://www.cnblogs.com/codespark/p/14657234.html