单选题
填空题
程序填空题
函数题
6-1 简单输出整数 (10 分)
本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数。
函数接口定义:
void PrintN ( int N );
其中N是用户传入的参数。该函数必须将从1到N的全部正整数顺序打印出来,每个数字占1行。
裁判测试程序样例:
#include <stdio.h>
void PrintN ( int N );
int main ()
{
int N;
scanf("%d", &N);
PrintN( N );
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
输出样例:
1
2
3
void PrintN ( int N ){
int i =1 ;
while(i<=N){
printf("%d\n",i);
i++;
}
}
6-2 简单求和 (10 分)
本题要求实现一个函数,求给定的N个整数的和。
函数接口定义:
int Sum ( int List[], int N );
其中给定整数存放在数组List[]中,正整数N是数组元素个数。该函数须返回N个List[]元素的和。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int Sum ( int List[], int N );
int main ()
{
int List[MAXN], N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%d", &List[i]);
printf("%d\n", Sum(List, N));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
12 34 -5
输出样例:
41
int Sum ( int List[], int N ){
int sum = 0;
for(int i = 0 ;i < N;i++){
sum+=List[i];
}
return sum;
}
6-3 求自定类型元素的平均 (10 分)
本题要求实现一个函数,求N个集合元素S[]的平均值,其中集合元素的类型为自定义的ElementType。
函数接口定义:
ElementType Average( ElementType S[], int N );
其中给定集合元素存放在数组S[]中,正整数N是数组元素个数。该函数须返回N个S[]元素的平均值,其值也必须是ElementType类型。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
typedef float ElementType;
ElementType Average( ElementType S[], int N );
int main ()
{
ElementType S[MAXN];
int N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%f", &S[i]);
printf("%.2f\n", Average(S, N));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
12.3 34 -5
输出样例:
13.77
ElementType Average( ElementType S[], int N ){
float sum =0;
for(int i =0 ;i <N;i++){
sum+=S[i];
}
float avg = sum/N;
return avg;
}
6-4 阶乘计算升级版 (20 分)
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
15
输出样例:
1307674368000
过了4个点。最大的没过
void Print_Factorial ( const int N ){
long long s =1;
if(N<0)
printf("Invalid input");
else{
for(int i = 1 ;i <= N;i++)
s*=i;
printf("%lld",s);
}
}
6-5 在数组中查找指定元素 (15 分)
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到
则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x;
int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
else
printf("Not found\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
1 2 2 5 4
2
输出样例1:
index = 1
输入样例2:
5
1 2 2 5 4
0
输出样例2:
Not found
作者: 张泳
单位: 浙江大学城市学院
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
int search( int list[], int n, int x ){
int k =-1;
for(int i = 0 ;i < n;i++){
if(x == list[i]){
k = i;
break;}
else
k =-1;
}
return k;
}
6-6 数组循环右移 (20 分)
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。
函数接口定义:
int ArrayShift( int a[], int n, int m );
其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
代码如下
int ArrayShift( int a[], int n, int m ){
int t;
for(int i = 0 ;i < m;i++){
t= a[n-1];
for(int j = n-1;j >=1;j--){
a[j]=a[j-1];
}
a[0] = t;
}
return a[n];
}
6-7 报数 (20 分)
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
void CountOff( int n, int m, int out[] );
其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff将每个人的退出顺序编号存在数组out[]中。因为C语言数组下标是从0开始的,所以第i个位置上的人是第out[i-1]个退出的。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 20
void CountOff( int n, int m, int out[] );
int main()
{
int out[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
CountOff( n, m, out );
for ( i = 0; i < n; i++ )
printf("%d ", out[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
11 3
输出样例:
4 10 1 7 5 2 11 9 3 6 8
void CountOff( int n, int m, int out[] )
{
int t = n;
int j = 0;
int c = 0;
if(m==1){
for(int i = 0 ;i <n;i++)
out[i]=i+1;
}
else{
for(int i = 0 ; i < n; i++)
{
out[i] = 0;
}
for(int i=0 ;i<=n; i++)
{
if(i == n)
i = 0;
if(out[i] ==0)
j++;
if(j == m)
{
t--;
c++;
out[i] = c;
j = 0;
}
if(t==1&&out[i]==0){
out[i]=c+1;
break;
}
}
}
}
6-8 使用递归函数计算1到n之和 (10 分)
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。
函数接口定义:
int sum( int n );
该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。
裁判测试程序样例:
#include <stdio.h>
int sum( int n );
int main()
{
int n;
scanf("%d", &n);
printf ("%d\n", sum(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
55
输入样例2:
0
输出样例2:
0
int sum( int n ){
int Sum =0;
if(n < 0){
return 0;
}
if(n){
Sum=n+sum(n-1);
}
return Sum;
}
6-9 使用函数的选择法排序 (25 分)
本题要求实现一个用选择法对整数数组进行简单排序的函数。
函数接口定义:
void sort( int a[], int n );
其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
void sort( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);
sort(a, n);
printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4
5 1 7 6
输出样例:
After sorted the array is: 1 5 6 7
void sort( int a[], int n ){
int t =0;
for(int i=0;i<n-1;i++)
for (int j=i+1;j<n;j++)
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
6-10 二分法查找 (10 分)
函数为二分法查找key值。数组中元素已递增排序,若找到key则返回对应的下标,否则返回-1。
函数接口定义:
int fun(int a[],int n,int key);
其中 a 、n 和 key 都是用户传入的参数。函数用二分法查找key 值。数组 a 中的n 个元素已递增排序,若找到key 则返回对应的下标,否则返回-1数。
裁判测试程序样例:
#include <stdio.h>
int fun(int a[],int n,int key);
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10}, b,c;
b=4;
c=fun(a,10,b);
if(c==-1)printf(“not found”);
else printf(“position %d\n”,c);
return 0;
}
/* 请在这里填写答案 */
输出样例:
position 3
int fun(int a[],int n,int key){
int left = 0;
int right = n-1;
int mid;
int k ;
while(left <= right){
mid = (left+right)/2;
if(key > a[mid])
left = mid+1;
else if(key<a[mid])
right = mid -1;
else if(key == a[mid]){
k = mid;
break;
}
else k =-1;
}
return k;
}
**
编程题
**
7-1 输出冒泡排序过程 (10 分)
输入n(1≤n≤10)个整数,用冒泡排序法对其从小到大排序,共进行n-1趟,要求输出每一趟的排序情况。
输入格式:
先输入个数n,再输入n个整数。
输出格式:
第1趟结果
第2趟结果
…
第n-1趟结果
每个数后面有一个空格,每个序列占一行。
输入样例:
5
4 2 3 2 1
输出样例:
2 3 2 1 4
2 2 1 3 4
2 1 2 3 4
1 2 2 3 4
#include <stdio.h>
#include <stdlib.h>
void Sort(int arry[],int n){
int i,j,k,t;
for (i=n-1; i>0; i--)
{
for (j=0; j<i; j++)
{
if (arry[j] > arry[j+1])
{
t= arry[j];
arry[j]=arry[j+1];
arry[j+1]=t;
}
}
for(k = 0 ;k <n;k++){
printf("%d ",arry[k]);
}
printf("\n");
}
}
int main()
{
int n;
scanf("%d",&n);
int arry[n];
for(int i = 0 ;i < n;i++){
scanf("%d",&arry[i]);
}
Sort(arry,n);
return 0;
}
7-2 冒泡法排序 (20 分)
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。
输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。
输入样例:
6 2
2 3 5 1 6 4
输出样例:
2 1 3 4 5 6
#include <stdio.h>
#include <stdlib.h>
void Sort(int arry[],int n,int m){
int i,j,k,t;
for (i=n-1; i>0; i--)
{
for (j=0; j<i; j++)
{
if (arry[j] > arry[j+1])
{
t= arry[j];
arry[j]=arry[j+1];
arry[j+1]=t;
}
}
if(m==1){
for(k = 0 ;k <n-1;k++){
printf("%d ",arry[k]);
}
printf("%d",arry[n-1]);
return;
}
m--;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int arry[n];
for(int i = 0 ;i < n;i++){
scanf("%d",&arry[i]);
}
Sort(arry,n,m);
return 0;
}
7-3 冒泡法排序 (10 分)
将一个具有20个元素的数组中的中间10个元素按从大到小顺序排序,要求使用冒泡法排序。
输入格式:
在一行中输入20个小于50的整数,数据之间只能用1个空格间隔。
输出格式:
直接输出变化后的数组,每个数输出占4列列宽。
输入样例:
5 4 3 2 1 8 5 2 9 6 3 1 4 7 4 1 2 3 4 5
输出样例:
5 4 3 2 1 9 8 7 6 5 4 4 3 2 1 1 2 3 4 5
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arry[20];
for(int i = 0 ;i < 20;i++){
scanf("%d",&arry[i]);
}
int t;
for(int i = 0 ; i < 9 ;i++){
for(int j = 5 ;j < 15 ;j++)
{
if(arry[j]<arry[j+1]){
t=arry[j];
arry[j] = arry[j+1];
arry[j+1] = t;
}
}
}
for(int i =0 ;i <20;i++)
printf("%4d",arry[i]);
return 0;
}
7-4 阶乘之和取模 (25 分)
输入正整数n, 计算S = 1!+2!+…+n!的末6位(不含前导0). 这里1<=n<=109.
输入样例:
例如输入:
20
输出样例:
输出:
820313
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
if(n >= 24){
printf("940313");
exit(0);
}
int s= 1;
int sum =0;
for(int i = 1; i<=n;i++){
s*=i;
s%=1000000;
sum+=s;
}
printf("%d",sum%1000000);
return 0;
}
7-5 求最小值和次小值 (25 分)
本题目要求读入n个整数,要求用最少的比较次数,输出它们的最小值和次小值。例如,对于12 13 1 10 34 1这6个数,最小值为1,次小值
为10。
输入格式:
输入有两行。第一行为整数个数n(≤1 000 000),第二行给出n个以空格分隔的整数。
输出格式:
对每一组输入,在一行中输出最小值和次小值,中间以一个空格分隔,但行尾没有多余空格。如果输入数据不足两个,则输出“Invalid Input”。如果没有次小值,则输出“There is no second smallest element”。
输入样例:
6
12 13 1 10 34 1
输出样例:
1 10
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int arry[n];
if(n<=1)
{
printf("Invalid Input");
exit(0);
}
for(int i = 0 ; i < n; i++)
{
scanf("%d",&arry[i]);
}
int Bmin=arry[0],Smin =arry[0];
for(int i = 0 ; i < n; i++)
{
if(arry[i] < Smin)
{
if(arry[i]< Bmin)
{
Smin = Bmin;
Bmin =arry[i];
}
else if(Bmin == arry[i])
continue;
else
Smin =arry[i];
}
}
if(Bmin != Smin)
printf("%d %d",Bmin,Smin);
else
printf("There is no second smallest element");
return 0;
}
7-6 求素数个数 (30 分)
求素数的个数。本题要求编写一个程序,求1~n的素数个数。 要求至少给出两种解法,对于相同的n,给出这两种解法的结果,通过相关数据进行测试,目的是通过对比同一问题不同解法的绝对执行时间体会如何设计“好”的算法。
输入格式:
输入在一行中给出1个整数n(<= 10 000 000)。
输出格式:
对每一组输入,在一行中输出1~n的素数个数。
输入样例1:
5
输出样例1:
3
输入样例2:
14
输出样例2:
6
最大素数没求出来
#include <stdio.h>
#include <stdlib.h>
int isPrime(int n){
if(n<2)
return -1;
else if(n == 2)
return 1;
else if(n == 3)
return 1;
else if(n % 2 == 0||n % 3 ==0)
return -1;
for(int i = 5;i*i<=n;i+=2)
if(n%i==0){
return -1;
break;
}
return 1;
}
int main()
{
int n;
scanf("%d",&n);
int sum =0 ;
for(int i = 1 ;i <= n;i++){
if(isPrime(i) == 1){
sum++;
}
}
printf("%d",sum);
return 0;
}