天梯题目解答——1205、1075、1083、1160

1205 单词翻转:

题目描述 Description

给出一个英语句子,希望你把句子里的单词顺序都翻转过来

输入描述 Input Description

输入包括一个英语句子。

输出描述 Output Description

按单词的顺序把单词倒序输出

样例输入 Sample Input

I love you

样例输出 Sample Output

you love I

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

void resever_word(string str1){
    int len = str1.size();
    int i=0;
    while(i<len/2){
        str1[i] = str1[len-i-1]^str1[i];
        str1[len-i-1] = str1[i]^str1[len-i-1];
        str1[i] = str1[i]^str1[len-i-1];
        i++;
    }
    int fr=0,er=0;
    for(int j=0;j<len;j++)
    {
        er = j;
        if(str1[er] == ' ' || er==len-1)
        {
            if(er==len-1)
                er++;
            int k=0;
            while(k<(er-fr)/2){
                str1[fr+k] = str1[er-k-1]^str1[fr+k];
                str1[er-k-1] = str1[fr+k]^str1[er-k-1];
                str1[fr+k] = str1[fr+k]^str1[er-k-1];
                k++;
            }
            fr = er+1;
        }
    }
    cout << str1 << endl;
}

int main()
{
    string str;
    getline(cin,str);
    resever_word(str);
    return 0;
}

  读取输入语句,先整体句子翻转,再翻转每个单词。

1075 明明的随机数:

题目描述 Description

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入描述 Input Description

有2行,第1行为1个正整数,表示所生成的随机数的N个数:

第2行有N个用空格隔开的正整数,为所产生的随机数

输出描述 Output Description

第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小

到大排好序的不相同的随机数。

样例输入 Sample Input

10

20 40 32 67 40 20 89 300 400 15

样例输出 Sample Output

8

15 20 32 40 67 89 300 400

#include <iostream>
#include <algorithm>

using namespace std;


int main()
{
    int n;
    cin >> n;
    int num[100]={0},onum[100]={0};
    for(int i=0;i<n;i++)
    {
        cin >> num[i];
    }
    cout << endl;
    sort(num,num+n);
    int j=1,m=1;
    onum[0] = num[0];
    while(j<n)
    {
        while(num[j]==num[j-1]){
            j++;
        }
        onum[m++] = num[j];
        j++;
    }
    cout << m << endl;;
    for(int i=0;i<m;i++)
    {
        cout << onum[i] << " ";;
    }
    return 0;
}

  去掉重复是将不重复的数据放到新的arrary中。

1083 Cantor表

题目描述 Description

现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…

输入描述 Input Description

整数N(1≤N≤10000000)

输出描述 Output Description

表中的第N项

样例输入 Sample Input

7

样例输出 Sample Output

1/4

#include <iostream>
using namespace std;

int main()
{
    int n,i=1;
    cin >> n;
    int sum = 0;
    for(;sum<n;i++)
    {
        sum = sum+i;
    }
    i = i-1;    //i斜行
    int a=1,b=1,num;
    if(i%2 == 0){
        num = sum-n+1;
        b = num;
        a = i+1-b;
        cout << a << "/" << b;
    }
    else{
        num = sum-n+1;
        a = num;
        b = i+1-a;
        cout << a << "/" << b;
    }
    return 0;
}

  先判断在第几斜行,再判断第i斜行的第几个数,由i为奇偶来判断是从上还是从下开始走,即a、b的计算方法。

1160 蛇形矩阵

题目描述 Description

小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.

输入描述 Input Description

n(即n行n列)

输出描述 Output Description

n+1行,n行为组成的矩阵,最后一行为对角线数字之和

样例输入 Sample Input

3

样例输出 Sample Output

5 4 3
6 1 2
7 8 9
25

#include <iostream>
using namespace std;

#define MIN 100
#define MAX 10000

int main()
{
    int n, m, num[MAX]={0},snake[MIN][MIN]={0};
    cin >> n;
    if(n%2==0)
        return 0;
    m = n*n;
    int i=0,j=0;
    //存下n的矩阵的所有数,顺序排放在num中
    while(i<(m))
    {
        num[i] = i+1;
        i++;
    }
    //分配对角线的值
    int core,up,down;
    core = n/2;
    up = core-1;
    down = core+1;
    snake[core][core] = 1;
    for(i=2;i<=n;i=i+2)
    {
        snake[up][up] = i*i+1;
        snake[down][down] = (i+1)*(i+1);
        up--;down++;
    }
    //分配上半矩阵
    up = core-1;
    for(i=2;i<n;i=i+2)
    {
        j=1;
        while(j<=i)
        {
            snake[up][up+j] = snake[up][up]-j;
            snake[up+j][up] = snake[up][up]+j;
            j++;
        }
        up--;
    }
    //分配下半矩阵
    down = core+1;
    for(i=1;i<n;i+=2)
    {
        j=1;
        while(j<=i)
        {
            snake[down][down-j] = snake[down][down]-j;
            snake[down-j][down] = snake[down-i-1][down]-(i-j+1);
            j++;
        }
        down++;
    }
    int sum=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            cout << snake[i][j] << " ";
            if(j == (n-i-1)||j==i){
                sum = sum+snake[i][j];
            }
        }
        cout << endl;
    }
    cout << sum;
    return 0;
}

  自己写的,可能赋值麻烦了点,不过还挺好理解的。

  先给对角线赋值(core,core),up和down分别沿着对角线往上下两个方向走。可以写几个矩阵例子,n为偶数最大值在右上顶角,n为奇数最大值在左下顶角,这里题目要求n是奇数。

  上三角矩阵以右上顶角(up,up)值为标准,向下每行+1,向右每列-1,这个容易写;下三角矩阵,以对角线上左下角(down,down)为标准,向左每列-1,但是向上就得以(down-i-1,down)的值为标准,依次网上-(i-j-1),这里可能麻烦点,反正标准点可以换,自然计算方式也可以换。

  最后打印对角线上的值要包括X两条对角线。

原文地址:https://www.cnblogs.com/heyuheitong/p/4015235.html