**01:**明明的随机数
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了试验的客观性,他先用计算机生成N个1到1000之间的随机整数(N<=100),对其中重复的数字,只保留一个,把其余相同的去掉。不同的数对应着不同的学生学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成"去重"和"排序"的工作。
输入
有两行,第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
代码
cpp
#include<iostream>
using namespace std;
int main(){
bool a[1001]={};
int b,n,cnt=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>b;
a[b]=1;
}
for(int i=1;i<=1000;i++){
if(a[i]==1)cnt++;
}
cout<<cnt<<endl;
for(int i=1;i<=1000;i++){
if(a[i]==1)cout<<i<<" ";
}
return 0;
}
02:尼科梅彻斯定理
题目描述
任何一个正整数n的立方都可以写成n个连续奇数之和, 这就是著名的尼科梅彻斯定理。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
现在当 n 给出之后,请你按从小到大的顺序输出这一串连续的奇数 。
输入
只有一 行,一个正整数 n。 (n<1000)
输出
只有一行, 符合要求的 一串连续的奇数, 各数间只能用一空格隔开,行尾不能有多余的空格和回车。
样例输入 复制
4
样例输出 复制
13 15 17 19
代码
cpp
#include<iostream>
using namespace std;
int main(){
int n,p;
cin>>n;
int a[n];
p=n*n;
if(p%2==1){
for(int i=n*n-n+1;i<=n*n+n;i+=2){
cout<<i<<" ";
}
}else{
for(int i=n*n-n+1;i<=n*n+n-1;i+=2){
cout<<i<<" ";
}
}
return 0;
}
03:喝醉的狱卒
题目描述
在一所监狱里有一条长长的走廊,沿着走廊排列着n个牢房。每个牢房有一个囚犯,而且房门都是锁着的。
一天晚上,狱卒觉得无聊,于是他决定玩一个游戏。第一轮,他喝了一口威士忌,然后沿着走廊,将所有牢房的门打开 。第二轮,他又喝了一口威士忌.然后又沿着走廊,将所有编号为2的倍数的牢房锁上 。三轮,他再喝一口 威士忌,再沿着走廊,视察所有编号为3的倍数的牢房。如果牢房是 锁着的,他就把它打开;如果牢房是开着的,他就把他锁上。 他如此玩了 n 轮后, 喝下最后一 口威士忌, 醉倒了。 当他醉倒后 , 一些犯人发现他们的牢房开着而且狱卒己经无能为力,他们立刻逃跑了。现给出走廊上牢房的数目,请你确认有多少犯人逃出了监狱。
输入
只有一行,为一个不大 于100000的整数,表示牢房的数目 n。
输出
只有一行,一个整数,表示逃跑的犯人的数目 。
样例输入 复制
5
样例输出 复制
2
代码
cpp
#include<iostream>
using namespace std;
int main(){
int n,cnt=0;
cin>>n;
bool a[n+1]={};
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
a[j]=!a[j];
}
}
for(int i=1;i<=n;i++){
if(a[i]==1){
cnt=cnt+1;
}
}
cout<<cnt;
return 0;
}
04:3n+1数链问题
题目描述
在计算机科学上, 有很多类问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。
现在我们就有这样一个问题,问题如下:
(1) 输入一个正整数 n;
(2) 把 n 显示出来;
(3) 如果 n=1则结束;
(4) 如果 n 是奇数则 n 变为 3*n+1 ,否则 n 变为 n/2;
(5) 转入 (2) 步.
例如对于输 入的正整数 22,应该有如下 数列被显示 出来:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
我们推测:对于任意一个正整数,经过以上算法最终会推到 1 。尽管这个算法很简单,但我们仍然无法确定我们的推断是否正确。不过好在我们有计算机, 我们验证了对于小于1000000的正整数都满足以上推测。
对于给定的正整数n,我们把显示出来的数的个数定义为n的链长,例如22的链长为16.
你的任务是编写一个程序,对于任意一对正整数 i 和 j , 给出 i 与 j 之间的最长链长,当然这个最长链长是由 i 与 j 之间的其中一个正整数产生的。我们这里的 i 和 j 既包 括 i 也包括 j 。
输入
只有一 行,二个正整数 i 和 j , i 和 j 之间 以一个空格隔开。 0<i<=j<1000 。
输出
只有一行, 一个正整数 , 即为 i 与 j 之间的最长链长。(最长链长保证在 150 以内)
样例输入 复制
1 10
样例输出 复制
20
代码
cpp
#include<iostream>
using namespace std;
int main(){
int i,j,n,cnt=0,max=0;
cin>>i>>j;
for(int a=i;a<=j;a++){
cnt=1;
n=a;
while(n!=1){
if(n%2==1){
n=n*3+1;
cnt++;
}else{
n=n/2;
cnt++;
}
}
if(max<cnt){
max=cnt;
}
}
cout<<max;
return 0;
}