首页 > 代码库 > 天梯题目解答——1205、1075、1083、1160

天梯题目解答——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 10000int 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两条对角线。

 

 

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