先给大家道个歉,后面两个题目可以不用写,不计算分数的。
第一题
思路解析
这一题只需要依次读取小明需要答应的材料,随后对每份材料的字数做一个判定,即可得出小明需要打印多少份材料了,有一个比较有趣的点在于如何判定需要多少张纸,一个比较简单的办法是先用字数num对70取余,从而得到num是否是70的倍数,如果是,直接除以70即可得到需要的纸张数量,否则的话需要再最后的结果上加一。(先学习过数组的同学可以自行想办法优化)
#include <iostream>
using namespace std;
int main(){
int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
double b1,b2,b3,b4,b5,b6,b7,b8,b9,b10;
cin>>a1>>a2>>a3>>a4>>a5>>a6>>a7>>a8>>a9>>a10;
if(a1%70 != 0)
b1 = 0.1*(a1/70+1);
else
b1 = 0.1*(a1/70);
if(a2%70 != 0)
b2 = 0.1*(a2/70+1);
else
b2 = 0.1*(a2/70);
if(a3%70 != 0)
b3 = 0.1*(a3/70+1);
else
b3 = 0.1*(a3/70);
if(a4%70 != 0)
b4 = 0.1*(a4/70+1);
else
b4 = 0.1*(a4/70);
if(a5%70 != 0)
b5 = 0.1*(a5/70+1);
else
b5 = 0.1*(a5/70);
if(a6%70 != 0)
b6 = 0.1*(a6/70+1);
else
b6 = 0.1*(a6/70);
if(a7%70 != 0)
b7 = 0.1*(a7/70+1);
else
b7 = 0.1*(a7/70);
if(a8%70 != 0)
b8 = 0.1*(a8/70+1);
else
b8 = 0.1*(a8/70);
if(a9%70 != 0)
b9 = 0.1*(a9/70+1);
else
b9 = 0.1*(a9/70);
if(a10%70 != 0)
b10 = 0.1*(a10/70+1);
else
b10 = 0.1*(a10/70);
cout << b1+b2+b3+b4+b5+b6+b7+b8+b9+b10;
return 0;
}
第二题
思路解析
这种情况就是需要对输入的数字进行一次判断,对不同分段的工资给出不同的计算方法。比较常见的一个错误是在计算800到5000元这个工资段位的时候,有些同学会将判断条件写为这样:
800<income<=5000
这样是不对的,计算机执行该过程的时候是从左到右顺序执行,也就是它会优先判断800与income的大小关系,从而得到一个bool值,再用bool值和5000比较,很显然地,我们就可以发现这个表达式的值始终为真。正确的写法就是:
800<income&&income<=5000
完整代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
/*begin
end*/
int a;
double b;
cin >>a;
if(a<=800)
b=0;
else if(a<=5000&&a>800)
b=0.03*(a-800);
else
b=0.2*(a-5000)+0.03*(5000-800);
cout.setf(ios::fixed);
cout <<"个人所得税"<< setprecision(2)<<b<<"元";
return 0;
}
第三题
思路解析
此题需要设计一个比较大小的算法,此处直接依次选出两个数之间最大的一个数就可以,以数字a,b,c为例子,很自然的有一个式子:
a和b<max(a,b)<max(max(a,b),c)
从而我们可以得出下面的代码(注意判断输入条件,因为输入的数字可能是用,
分割开的”
#include <iostream>
using namespace std;
int main(){
int a,b,c,max;
cin >>a>>b>>c;
if(a>b&&a>c)
max=a;
else if(b>a&&b>c)
max=b;
else
max=c;
cout << max;
return 0;
}
第四题
思路解析
这一部分主要是判定甲乙二人出手情况,这个题的题目描述有点问题,实际上只需要比较两个输入来判断到底是谁赢就可以,三个人的出手情况总共有3*3=9种,针对这九种情况进行不同的分类就好,值得一提的是,其实只需要判断其中的6种情况,剩下的else就好,代码如下:
#include <iostream>
using namespace std;
int main(){
char a,b;
cin >>a>>b;
if((a=='C'&&b=='J')||(a=='J'&&b=='B')||(a=='B'&&b=='C'))
cout << "甲胜";
else if((a=='C'&&b=='C')||(a=='B'&&b=='B')||(a=='J'&&b=='J'))
cout <<"平局";
else
cout <<"乙胜";
return 0;
}
第五题
思路解析
这个先给大家道歉,这题出的太有问题了,至少也得过两星期这才好做,但反正题目出都出了,大家也就尝试做下吧,我先提供两种思路,第一种是只用if-else来做,第二种就是使用循环等方法来做,为了简化思考,可以将输入的数字加一,将过去了多少天转为计算(包含2000年1月1日在内)第多少天。
方法一
就像我说的,假设没有闰年存在,那么可以简单得出年份,又因为题目要求的是最高只到9999年,那么这之中最多又多少个闰年呢,大约就是8000/4 =2000个,这误差显然不太能让人接受,所以不妨转化下思路,闰年的周期是以400年为一个周期,一个周期的天数是固定的,一个周期最多100个闰年,这样误差就能接受了,为u为什么这么说,一年的偏差只需要在365天之内,就是可以通过一个if-else判定是否需要到回到上一年,那么初步的思路有了:
假定题目给的天数为input,可以将input++就将问题转化为求解包含2000年1月1日在内,总共第多少天。
(1)计算400这一个周期之内总共有多少天(记为circle),以此判定input中含有多少个周期,通过令daysInCircle = input% circle;天数压缩到一个周期(400年之内)
(2)在这一个周期之内假定没有闰年的概念,用daysInCircle对365进行相除或者取余得到对应循环周期中已经过去的年数yearInCircle,以及对应当前年份的第x天,其中x<365,这个天数是我们没有计算闰年的情况下得到,而每过去一个闰年,这个数字就会相当于多了一天,所以在最后需要算下过去了y个闰年,从而得到daysInYear = x-y就是当前年份的第多少天,注意,这个时候得到的可能会是一个负数,此时则需要考虑上一年是否是闰年,对yearInCircle进行减一,再让daysInYear加上对应的天数
(3)计算月份的相信大家也有自己的想法,实际上就是多次的if-else,此处如果不会循环和数组的话就只能多写if-else。。。,很抱歉出现这种情况,我有罪,我忏悔<(_ _)>。
#include <iostream>
using namespace std;
#include <iomanip>
int main(){
int input = 0 ;
cin >> input;
string weekDay ;
switch(input%7)
{
case 0:weekDay = "Saturday";break;
case 1:weekDay = "Sunday";break;
case 2:weekDay = "Monday";break;
case 3:weekDay = "Tuesday";break;
case 4:weekDay = "Wednesday";break;
case 5:weekDay = "Thursday";break;
case 6:weekDay = "Friday";break;
}
input++;//从过去几天转为计算是第几天
//首先进行年份的判定
int circle = 365 * 400 + 100 - 4 + 1;//计算一个大周期有多少天
int numCircle = input / circle;//以此计算目标是2000年1月1日之后的第几个周期
int daysInCircle = input% circle;//得出这个是周期内的第几天
//接下来先假设没有闰年存在,计算出一个天数出来
int yearInCircle = daysInCircle / 365;
int daysInYear = daysInCircle % 365;
int currentYear = 2000 + numCircle * 400 + yearInCircle;
//之前忽略了闰年的计算,那么这一步我们就将它补回来,看看过去了多少个闰年,那么每过去一个闰年就要减一天
daysInYear -= yearInCircle / 4 - yearInCircle / 100 + yearInCircle / 400;
//这一减可能就把days变为0或者负数了,所以需要进行判断,将对应的天数加回来
if(daysInYear < 1)
{
currentYear--;
if((currentYear % 4 == 0 && currentYear % 100 != 100)||(currentYear % 400 == 0))
{
daysInYear += 366;
}
else
{
daysInYear += 365;
}
}
bool needAdd = false;//表示是否是闰年
if((currentYear % 4 == 0 && currentYear % 100 != 100)||(currentYear % 400 == 0))
{
needAdd = true;
}
//已经获取到了年内的第多少天
int month = 0;
if(needAdd)
{
if(daysInYear <= 31)
{
month = 1;
daysInYear -= 0;
}
else if (daysInYear <= 60)
{
month = 2;
daysInYear -= 31;
}
else if (daysInYear <= 91)
{
month = 3;
daysInYear -= 60;
}
else if (daysInYear <= 121)
{
month = 4;
daysInYear -= 91;
}
else if (daysInYear <= 152)
{
month = 5;
daysInYear -= 121;
}
else if (daysInYear <= 182)
{
month = 6;
daysInYear -= 152;
}
else if (daysInYear <= 213)
{
month = 7;
daysInYear -= 182;
}
else if (daysInYear <= 244)
{
month = 8;
daysInYear -= 213;
}
else if (daysInYear <= 274)
{
month = 9;
daysInYear -= 244;
}
else if (daysInYear <= 305)
{
month = 10;
daysInYear -= 274;
}
else if (daysInYear <= 335)
{
month = 11;
daysInYear -= 305;
}
else
{
month = 12;
daysInYear -= 335;
}
}
else
{
if(daysInYear <= 31)
{
month = 1;
daysInYear -= 0;
}
else if (daysInYear <= 59)
{
month = 2;
daysInYear -= 31;
}
else if (daysInYear <= 90)
{
month = 3;
daysInYear -= 59;
}
else if (daysInYear <= 120)
{
month = 4;
daysInYear -= 90;
}
else if (daysInYear <= 151)
{
month = 5;
daysInYear -= 120;
}
else if (daysInYear <= 181)
{
month = 6;
daysInYear -= 151;
}
else if (daysInYear <= 212)
{
month = 7;
daysInYear -= 181;
}
else if (daysInYear <= 243)
{
month = 8;
daysInYear -= 212;
}
else if (daysInYear <= 273)
{
month = 9;
daysInYear -= 243;
}
else if (daysInYear <= 304)
{
month = 10;
daysInYear -= 273;
}
else if (daysInYear <= 334)
{
month = 11;
daysInYear -= 304;
}
else
{
month = 12;
daysInYear -= 334;
}
}
//年月日已经计算完毕,接下来给出是周几就好
cout <<currentYear<<"-";
cout <<setw(2)<<setfill('0')<<month<<"-";
cout <<setw(2)<<setfill('0')<<daysInYear;
cout <<" "<<weekDay<<endl;
return 0;
}
第二种方法
这种就需要用上循环和数组了,可以不用和上一种那样那么抽象,如果同学们看不懂可以过两星期学会循环和数组再来看,思路上就是利用循环一年年减去得到一个只在一年内的天数,然后用数组存放各个月份的天数,最后再利用循环一个月一个月地减过去,判定到底是哪一个月,剩下的自然就是对应的日期,从而得到对应的年月日信息。
#include <iostream>
using namespace std;
#include <iomanip>
int main(){
int input = 0 ;
cin >> input;
string weekDay ;
switch(input%7)
{
case 0:weekDay = "Saturday";break;
case 1:weekDay = "Sunday";break;
case 2:weekDay = "Monday";break;
case 3:weekDay = "Tuesday";break;
case 4:weekDay = "Wednesday";break;
case 5:weekDay = "Thursday";break;
case 6:weekDay = "Friday";break;
}
input++;//同样的,我们可以得到是计算第几天
int years = 2000;
bool needAdd = false;
while(input > 0)
{
if((years % 4 == 0)&&(years % 100 != 0)|| years % 400 == 0)
{
input -= 366;
needAdd=true;
}
else
{
input -= 365;
needAdd = false;
}
years++;
}
//此时明显多减去了一年,还原下被减去的那一年就好了
years--;
if((years % 4 == 0)&&(years % 100 != 0)|| years % 400 == 0)
{
input += 366;
}
else
{
input += 365;
}
int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int month = 0;
for(int i=0;i<12;i++)
{
int currentDays = months[i];
if(i==1&&needAdd)
{
//2月份,需要判断是否是闰年
currentDays++;
}
if((input - currentDays) <= 0)
{
//就在当前月份
month = i + 1;
break;
}
else
{
input -= currentDays;
}
}
cout <<years<<"-";
cout <<setw(2)<<setfill('0')<<month<<"-";
cout <<setw(2)<<setfill('0')<<input;
cout <<" "<<weekDay<<endl;
return 0;
}
第六题
思路解析
这一题就不用那么抽象的写法了,那种方法不仅大幅增加思考难度,同时泛用性也不高,最主要写起来太坐牢了,同学们建议还是学会循环和数组再来写这一题好。。。这一题思路其实很简单,首先从开始年份加到结束年份的前一年,随后加上结束那一年1月1日到结束日期的天数,最后减去开始那一年1月1日到开始日期之间的天数就可以了,思路应该还是比较好理解的,主要就是这个东西不用循环和数组写起来很坐牢。。。<(_ _)>.
#include <iostream>
using namespace std;
bool needAdd(int year)
{
if((year % 4 == 0&&year % 100 != 0)||year % 400 == 0)
return true;
return false;
}
int main(){
int startYear,startMonth,startDay;
int endYear,endMonth,endDay;
cin >>startYear>>startMonth>>startDay;
cin >>endYear>>endMonth>>endDay;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int spacing = 0;
for(int i = startYear; i < endYear;i++)
{
if(needAdd(i))
{
spacing += 366;
}
else
{
spacing += 365;
}
}
if(needAdd(startYear))
months[2]=29;
for( int i = 1;i < startMonth;i++)
{
spacing -= months[i];
}
spacing -= startDay;
if(!needAdd(endYear))
months[2] = 28;
for(int i = 1;i < endMonth;i++)
{
spacing += months[i];
}
spacing += endDay;
cout <<spacing<<endl;
return 0;
}