天梯初级练习题目 7-61 ~ 7-70 含全部测试点

7-61 输出整数各位数字 分数 15

本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:

输入在一行中给出一个长整型范围内的非负整数。

输出格式:

从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:

123456

输出样例:

1 2 3 4 5 6 

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <stack>
using namespace std;
stack<int> st;
unsigned long long n;

// 迭代递归均可,这里采用迭代法
int main()
{
    cin >> n;
    do st.push(n % 10); while(n /= 10);
    while(st.size()) printf("%d ", st.top()), st.pop();
    return 0;
}

7-62 验证“哥德巴赫猜想” 分数 20

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:

输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24 = 5 + 19

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
int n;

bool check(int p)
{
    if(p <= 1) return false;
    for(int i = 2; i <= p / i; ++ i)
        if(p % i == 0) return false;
    return true;
}

int main()
{
    cin >> n;
    for(int i = 2; i <= n / 2; ++ i)
        if(check(i) && check(n - i))
        {
            printf("%d = %d + %d\n", n, i, n - i);
            break;
        }
    return 0;
}

7-63 找完数 分数 20

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30

输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
int n, m;

bool check(int p)
{
    int res = 0;
    for(int i = 1; i <= p / 2; ++ i)
        if(p % i == 0) res += i;
    return res == p;
}

int main()
{
    bool flag = true;
    cin >> n >> m;
    for(int i = n; i <= m; ++ i)
        if(check(i))
        {
            printf("%d = 1", i);
            for(int j = 2; j <= i / 2; ++ j)
                if(i % j == 0) printf(" + %d", j);
            flag = false;
            putchar('\n');
        }
    if(flag) puts("None");
    return 0;
}

7-64 打印九九口诀表 分数 15

下面是一个完整的下三角九九口诀表:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

本题要求对任意给定的一位正整数N,输出从1*1N*N的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
int n;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++ i)
    {
        for(int j = 1; j <= i; ++ j)
            printf("%d*%d=%-4d", j, i, i * j);
        putchar('\n');
    }
    return 0;
}

7-65 近似求PI 分数 15

本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。

2π​=1+31!​+3×52!​+3×5×73!​+⋯+3×5×⋯×(2×i+1)i!​+⋯

输入格式:

输入在一行中给出精度eps,可以使用以下语句来读输入:

scanf("%le", &eps);

输出格式:

在一行内,按照以下格式输出π的近似值(保留小数点后5位):

PI = 近似值

输入样例:

1E-5

输出样例:

PI = 3.14158

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
double e;
double ans = 1, tot = 1;

int main()
{
    cin >> e;
    for(int i = 1; tot >= e; ++ i)
        tot = tot * i / (2 * i + 1), ans += tot;
    printf("PI = %.5lf\n", 2 * ans);
    return 0;
}

7-66 统计一行文本的单词个数 分数 15

本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:

输入给出一行字符。

输出格式:

在一行中输出单词个数。

输入样例:

Let's go to room 209.

输出样例:

5

鸣谢用户 张麦麦 补充数据!

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
string input;
int cnt;

// 利用cin遇到空格结束一次读入的特性即可, scanf同理
int main()
{
    while(cin >> input) cnt ++;
    cout << cnt << endl;
    return 0;
}

7-67 查找整数 分数 10

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:

输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:

在一行中输出X的位置,或者“Not Found”。

输入样例1:

5 7
3 5 7 1 9

输出样例1:

2

输入样例2:

5 7
3 5 8 1 9

输出样例2:

Not Found

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
typedef long long LL;
LL n, x;

int main()
{
    cin >> n >> x;
    bool flag = true;
    for(int i = 0; i < n; ++ i)
    {
        int temp; cin >> temp;
        if(temp == x)
        {
            cout << i << endl;
            flag = false;
            break;
        }
    }
    if(flag) puts("Not Found");
    return 0;
}

7-68 将数组中的数逆序存放 分数 20

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。

输入格式:

输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。

输出格式:

在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。

输入样例:

4
10 8 1 2

输出样例:

2 1 8 10

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <vector>
using namespace std;
vector<int> st;
int n;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++ i)
    {
        int temp; cin >> temp;
        st.push_back(temp);
    }
    for(int i = st.size() - 1; i >= 0; -- i)
        printf("%d%s", st[i], i ? " " : "");
    return 0;
}

7-69 选择法排序 分数 20

本题要求将给定的n个整数从大到小排序后输出。

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

4
5 1 7 6

输出样例:

7 6 5 1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
const int N = 1010;
int st[N];
int n;

// 选择排序思想:
// 1.每次将序列分为两部分,分别为有序区和无序区, 初始时有序区为空
// 2.每一轮排序时,在无序区中选取需要的最值(顺排/逆排),将其放入有序区末尾
// 3.重复n次,序列有序化


int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++ i) cin >> st[i];

    for(int i = 1; i < n; ++ i)
    {
        int mx = i;
        for(int j = i + 1; j <= n; ++ j)
            if(st[mx] < st[j]) mx = j;
        swap(st[i], st[mx]);
    }

    for(int i = 1; i <= n; ++ i)
        cout << st[i] << " "[i == n];
    return 0;
}

7-70 交换最小值和最大值 分数 15

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。

注意:题目保证最大和最小值都是唯一的。

输入格式:

输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。

输出格式:

在一行中顺序输出交换后的序列,每个整数后跟一个空格。

输入样例:

5
8 2 5 1 4

输出样例:

1 2 5 4 8 

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
using namespace std;
const int N = 1010;
int st[N];
int mx = 1, mn = 1;
int n;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++ i) cin >> st[i];
    
    for(int i = 1; i <= n; ++ i)
    {
        if(st[mx] < st[i]) mx = i;
        if(st[mn] > st[i]) mn = i;
    }
    swap(st[1], st[mn]);
    if(mx == 1) mx = mn;
    swap(st[n], st[mx]);
    
    for(int i = 1; i <= n; ++ i)
        printf("%d ", st[i]);
    return 0;
}

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值