首页 > 代码库 > 天梯题目解答——1205、1075、1083、1160
天梯题目解答——1205、1075、1083、1160
1205 单词翻转:
给出一个英语句子,希望你把句子里的单词顺序都翻转过来
输入包括一个英语句子。
按单词的顺序把单词倒序输出
I love you
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 明明的随机数:
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
有2行,第1行为1个正整数,表示所生成的随机数的N个数:
第2行有N个用空格隔开的正整数,为所产生的随机数
第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小
到大排好序的不相同的随机数。
10
20 40 32 67 40 20 89 300 400 15
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表
现代数学的著名证明之一是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,…
整数N(1≤N≤10000000)
表中的第N项
7
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 蛇形矩阵
小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
n(即n行n列)
n+1行,n行为组成的矩阵,最后一行为对角线数字之和
3
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