X数

任务描述

编写一个程序,读入两个正整数a和b,并且a<=b, 计算并输出闭区间[a,b]中的X数。X数为各个数位上数字的立方和等于其自身的数字,例如:

153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 // 153 is a X-number.

12 is not equal to 1 * 1 * 1 + 2 * 2 * 2 // 12 is not a X-number.

如果没有找到X数,输出提示信息no

保证 $1\leq a\leq b\leq 2^{31}-1$。

编程要求

根据提示,在右侧编辑器补充代码,计算并输出[a,b]中的X数(以空格分隔),或者输出no

测试说明

平台会对你编写的代码进行测试:

测试输入:1 10 预期输出:1

测试输入:1 200 预期输出:1 153

参考代码

#include <iostream>
using namespace std;

int main(void) {

    int a,b; cin >> a >> b;
    bool not_start = true;
    for (int i=a;i<=b && i<=1000;i++) {
        int s=0;
        for (int j=i;j;j/=10) s += (j%10)*(j%10)*(j%10);
        if (s == i) {
            if (!not_start) cout << ' ';
            cout << i;
            not_start = false;
        }
    }
    if (not_start) cout << "no";
    cout << endl;

    return 0;
}

计算阶乘

任务描述

本关任务:编写一个能计算输入正整数的阶乘的小程序。 保证输入不大于20(注意使用long long)。

测试说明

平台会对你编写的代码进行测试:

测试输入:4 预期输出:24

测试输入:5 预期输出:120

参考代码

#include <iostream>
using namespace std;

int main(){
    int n; cin >> n;
    long long ans = 1;
    for (int i=1;i<=n;i++) ans = ans * i;
    cout << ans << endl;

    return 0;
}

数位和

任务描述

本关任务:定义 f(n) 为 n 在十进制下的数位和。例如 f(123)=1+2+3=6, f(2048)=2+0+4+8=14。

定义 f1(n) = f(n),f2(n)=f(f1(n)),fk(n) = f(fk-1(n)) (k>=2)。给定 n,求 f10(n)。

测试说明

输入描述:一个正整数 n(1<=n<=$10^9$)。 输出描述:输出 f10(n)。

样例输入:123456789 样例输出:9

参考代码

#include <iostream>
using namespace std;

int main(void) {
    /** begin **/
    int n; cin >> n;
    int ans = 0;
    for (;n;n/=10) ans = (ans + n%10)%9;
    if (ans==0) ans = 9;
    cout << ans << endl;
    /**  end  **/

    return 0;
}

最小公倍数

任务描述

本关任务:编写一个能计算两个正整数的最小公倍数的小程序。 保证输入的两个数都不超过100。

测试说明

平台会对你编写的代码进行测试:

测试输入:4 91 预期输出:364

测试输入:12 22 预期输出:132

参考代码

#include <iostream>
using namespace std;
int main(void) {
    int a,b,ans=0;
    cin >> a >> b;
    for (int i=1;i<=a*b;i++) {
        if (i%a==0 && i%b==0) {
            ans=i;
            break;
        }
    }
    cout << ans << endl;
    return 0;
}

打鱼还是晒网

任务描述

本关任务:判断某人是在打鱼,还是在晒网。 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。 注意要区分闰年和不是闰年的两种情况。

编程要求

每组输入只有一行,有三个整数,分别对应年,月,日。它们组合起来是一个有效的日期,且不早于1990年。 请你补充代码,判断某人在这个日子是在打鱼还是在晒网。 如果是在打鱼,则输出Fishing,否则输出Sleeping。 具体见测试说明。

测试说明

平台会对你编写的代码进行测试:

  • 测试输入:1991 10 25
  • 预期输出:Fishing

参考代码一

#include <iostream>
#include <iomanip>
using namespace std;

int main(void) {
    int y=1990, m=1, d=1;
    int yy, mm, dd;
    cin >> yy >> mm >> dd;

    // start from 1990-1-1
    // loop until yy-mm-dd
    // i denotes the number of days pass
    for (int i=0;;i++) {
        if (y == yy && m == mm && d == dd) {
            if (i % 5 < 3) cout << "Fishing\n";
            else cout << "Sleeping\n";
            break;
        }

        d++;
        if (((m==1||m==3||m==5||m==7||m==8||m==10||m==12) && d>31)
            || ((m==4||m==6||m==9||m==11) && d>30)
            || (m==2 && d>28+((y%4==0&&y%100!=0)||(y%400==0))))
            m++, d=1;

        if (m > 12) y++, m=1;
    }
    return 0;
}

参考代码二

#include <iostream>
using namespace std;

int main(void) {
    int y, m, d;
    cin >> y >> m >> d;

    int num_day = 0;
    // count days from 1990-01-01 to (y-1)-12-31
    for (int i=1990;i<y;i++) {
        num_day += 365 + ((i%4==0 && i%100!=0) || i%400==0);
    }

    // count days from (y)-01-01 to (y)-(m-1)-(final day of month m-1)
    for (int i=1;i<m;i++) {
        if (i == 2) num_day += 28 + ((y%4==0 && y%100!=0) || y%400==0);
        else num_day += 30 + (i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12);
    }

    // count days from (y)-(m)-01 to (y)-(m)-(d)
    num_day += d;

    if ((num_day-1) % 5 < 3) cout << "Fishing\n";
    else cout << "Sleeping\n";

    return 0;
}

参考代码三

#include <iostream>
using namespace std;

int main(void) {
    int y, m, d;
    cin >> y >> m >> d;

    int num_day = (y-1990) * 365;
    num_day += ((y-1)/4 - (y-1)/100 + (y-1)/400)
        - (1989/4 - 1989/100 + 1989/400);

    num_day += (m-1)*30 + (1<m) + (((y%4==0 && y%100!=0) || y%400==0)-2)*(2<m)
        + (3<m) + (5<m) + (7<m) + (8<m) + (10<m);

    num_day += d-1;


    if (num_day % 5 < 3) cout << "Fishing\n";
    else cout << "Sleeping\n";

    return 0;
}