第五周作业

第一题

这个题目相信大家都很熟悉了,本质上和之前做过的计算某个时间段之间有多少天没有区别,思路是一样的,可以参考第三次上机 那一篇的最后一题计算天数,最后计算对7取余的余数是多少即可

#include <iostream>
using namespace std;
int main()
{
    int year, month, day, num;
    cin >> year >> month >> day;
    /* 计算因为年份多出来的天数 */
    for (int i = 2000; i <= year - 1; i++) {
        day += 365;
        if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
            day += 1;           // 闰年多加1天
        }
    }
    /* 计算因为月份多出来的天数 */
    for (int i = 1; i <= month - 1; i++) {
        if (i == 2) {
            day += 28;          // 平年2月有28天
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                day += 1;       // 闰年2月多加一天
            }
        } else if (i == 4 || i == 6 || i == 9 || i == 11) {
            day += 30;          // 4 6 9 11月份
        } else {
            day += 31;          // 其他月份 即1 3 5 7 8 10 12
        }
    }
    num = (day + 4) % 7 + 1; 
    cout << "星期" << num << endl;
    return 0;
}

第二题

这个需要注意题目说的aaaa指的就是比如8888这种数字,而不是指a的4次方,理解了题目的意思之后就可以一个双层循环解决问题了,外层循环负责相加,内层循环获取当前需要增加的数字

#include<iostream>

using namespace std;

int main()
{
    int n, a, sum, a_n = 0;

    cin >> a >> n;

    for (int i=1; i<=n; i++) {
        a_n = a_n * 10 + a;
        sum += a_n;
    }

    cout << sum << endl;

    return 0;
}

第三题

这个算是很经典的循环题目 了,可以使用数组来依次存储每一项数列元素的值,但是也可以只用三个变量来完成计算,注意看, 斐波那契数列只需要前面两项元素的值就可以得出当前元素,所以每次实际上我们需要保存的就只有两个变量的值即可,具体操作可以参考下面的代码

#include<iostream>

using namespace std;

int main()
{
    int n;
    long long f_n = 1, a = 0, b = 1;

    cin >> n;

    for (int i=2; i<=n; i++) {
        f_n = a + b;
        a = b;
        b = f_n;
    }

    cout << f_n << endl;

    return 0;
}

第四题

这个题目其实就是很简单的循环,每一步计算的结果作为参数进行下一步计算即可,另外关于数位和这个问题也在之前的题目的中有讲过,就不再重复了

#include <iostream>
using namespace std;

int main(void) {
    int n, f_n;

    cin >> n;
    for(int i=0; i < 10; i++) {
        f_n = 0;
        while (n != 0) {
            f_n += n % 10;
            n /= 10;
        }
        n = f_n;
    }
    cout << f_n << endl;
    
	return 0;
}

第五题

这个题目其实不算难,主要是思路要清楚,最小公倍数是怎么求的大家高中应该学过。

  • 首先是计算最大公约数gcd。
  • 随后将原本的两个数a,b除以gcd,这样可以得到两个互质的数字c和d,那么他们的积就是c和d的最小公倍数。
  • 最后乘回之前的gcd即可得到目标数字

思路有了之后就是计算就可,之前也有过求gcd的题目,所以算法就不再重复了

#include<iostream>

using namespace std;

int main()
{
    int a, b, r;

    cin >> a >> b;

    while (b > 0) {
        r = a % b;
        a = b;
        b = r;
    }

    cout << a << endl;    

    return 0;
}

第六题

这题没有啥好的办法,就是强行计算就好了注意一下rev(1)=1,不要弄成rev(1)=1000这种就好

#include<iostream>

using namespace std;

int main()
{
    int n, counter = 0;

    cin >> n;

    for (int i=1; i<n; i++) {
        int rev = 0, x = i;
        while(x > 0) {
            rev = rev * 10 + x % 10;
            x /= 10;
        }
        if (rev + i == n) {
            counter++;
            // cout << i << endl;
        }
    }

    cout << counter << endl;

    return 0;
}

第七题

这个题目其实主要是有些语法上的问题,另外由于精度限制,除法的时候注意要写为小数除法(等式两边存在小数的时候编译器会自动转为小数除法),不然如果除号两边都是整数的话计算结果也会转化为整数,这样就会损失精度了。最后有个简单的再循环中可能要注意变量初始化的问题,其实由于计算的结果是可以继承的,里面那个for循环省略掉都没啥,不过那样要改的就有点多了

// 请在下方添加代码
/********** Begin *********/
#include<iostream>
#include<iomanip>
using namespace
std;
const double EPS = 1E-6;
int main() {
    int i, n, item;     /* item 可以是long long类型 */
    double e;
    e = 1;
    n = 1;
    
    // item = 1; 
    do {
        item = 1; /* 放到循环里面 */
        for (i = 1; i <= n; i++)
            item *= i;
            // e += 1 / item;   
        e += 1.0 / item;    /* 应该是小数除法 */    
        n++;
    } while (1.0 / item >= EPS);
    // cout <<”e =”<<fixed << setprecision(6) << e << endl;
    cout <<"e ="<<fixed << setprecision(6) << e << endl;        /* 应该使用英文分号 */
    return 0;
}
/********** End **********/

第八题

这个题目其实简化很多了,首先都是1磅重,那么就只需要选价值最高的几样物品即可,另外由于价值直接等于i,所以其实连循环都不用,直接计算等差数列和即可,感兴趣的同学可以自己搜索0-1背包问题深入下,提前学习动态规范方面的知识

#include<iostream>

using namespace std;

int main()
{
    int n, W, max_val = 0;

    cin >> n >> W;

    for(int i=0; i<W; i++) {
        max_val += n;
        n--;
    }

    cout << max_val << endl;

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值