题目描述:
浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
输入:
输入包含多组测试用例.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
输出:
请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
样例输入:
3 1
2 5 -1
5 3
1 2 3 4 5
0 0
样例输出:
5
5 4 3
【分析】可抽取模型:n个数从大到小排序后,输出前m个数
#include <stdio.h>
#include <algorithm>
#define maxn 100010
using namespace std;
int main()
{
int i,a[maxn];
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0 && m==0)
break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
if(n<=m)
{
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
else
{
sort(a,a+n);
if(m==1)
printf("%d\n",a[n-1]);
else
{
for(i=n-1;i>n-m;i--)
printf("%d ",a[i]);
printf("%d\n",a[n-m]);
}
}
}
return 0;
}
程序截图:
2. (2008年北京大学软件所计算机研究生机试真题)密码翻译
题目描述:
在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。
输入:
可能有多组测试数据。每组测试数据的第一行是字符串的数目n, (也要使用get(s)读取字符串,再用n=atoi(s)获得整数数值),其余n行每行一个字符串,用gets(s)方式读取这一行字符串.每个字符串长度小于80个字符。
输出:
对于每组数据,输出每行字符串的加密字符串。
样例输入:
1
Hello! How are you!
样例输出:
Ifmmp! Ipx bsf zpv!
【分析】注意这里将字符串的数目n设置为字符串类型,即输入的n为一个字符串s,然后使用n=atoi(s)获取整数数值
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxlen 105
void Trans(char *str)
{
int i;
for(i=0;str[i];i++)
{
if((str[i]>='A'&&str[i]<'Z') || (str[i]>='a'&&str[i]<'z'))
str[i]+=1;
else if(str[i]=='Z')
str[i]='A';
else if(str[i]=='z')
str[i]='a';
}
}
int main()
{
int i,j,n;
char str[maxlen],nstr[maxlen];
while(gets(nstr))
{
n=atoi(nstr); //获取整数数值
for(i=0;i<n;i++)
{
gets(str);
Trans(str); //翻译
puts(str);
}
}
return 0;
}
程序截图:
※3. XXX定律之画X
题目描述:
给你一个n,然后让你输出F(n)
规则是这样的,F(n)的输出结果是:
F(n-1) F(n-1)
F(n-1)
F(n-1) F(n-1)
F(1)的输出结果是:X
那么根据规则F(2)的输出结果应该是:
X X
X
X X
输入:
题目有多组输入,每组输入一个n(n<=7)。
当输入零或负数的时候结束输入。
输出:
对每组输入输出相应的F(n),每组输出最后一行是‘#’。
样例输入:
1
2
3
-1
样例输出:
X
#
X X
X
X X
#
X X X X
X X
X X X X
X X
X
X X
X X X X
X X
X X X X
#
源代码(参考):
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N (int)(pow(3, 6))
int p[N][N]; //设置这个二维数组保存XXX图案
void set(int n, int x, int y) //设置图案中的每个点保存' '还是'X',递归进行此过程
{
if (n == 1) //输入的n=1,则图案中只有一个X,设a[0][0]=1并直接返回
{
p[x][y] = 1;
return;
}
int s = pow(3, n-2); //n>=2时以n=2是的图案为一个单位,递归打印n更大的时候的情况
set(n-1, x, y);
set(n-1, x+s, y+s);
set(n-1, x+2*s, y);
set(n-1, x, y+2*s);
set(n-1, x+2*s, y+2*s);
}
void print(int n) //打印图案
{
int size = pow(3, n-1);
for (int i=0; i<size; i++)
{
for (int j=0; j<size; j++)
{
if (p[i][j] == 0)
printf(" ");
else
printf("X");
}
printf("\n");
}
printf("#\n");
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
if (n <= 0)
break;
memset(p, 0, sizeof(p));
set(n, 0, 0);
print(n);
}
return 0;
}
程序截图: