第一章 绪论

时间:2024-03-16 07:26:12

单选题

第一章 绪论

填空题

第一章 绪论

程序填空题

第一章 绪论

函数题

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中的数据由(a​0​​a​1​​⋯a​n−1​​)变换为(a​n−m​​⋯a​n−1​​a​0​​a​1​​⋯a​n−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<=10​9​​.
输入样例:

例如输入:

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;
}