第三次上机作业解析

先给大家道个歉,后面两个题目可以不用写,不计算分数的。

第一题

思路解析

这一题只需要依次读取小明需要答应的材料,随后对每份材料的字数做一个判定,即可得出小明需要打印多少份材料了,有一个比较有趣的点在于如何判定需要多少张纸,一个比较简单的办法是先用字数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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值