安工 计科专业C语言考试大致范围

一、单选 十五道(部分取自pta 2023~24高级语言程序设计I客观题练习)

二、填空题 七道(部分取自pta 2023~24高级语言程序设计I客观题练习)

三、编程题 四道(下面是可能考题)

    1.取数字

        1.1:进制转化

将十进制整数转换成k(2≤k≤16)进制数。注意,10~15分别用字母A、B、C、D、E、F表示。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入两个整数n和k。

输出格式:
对于每组测试,先输出n,然后输出一个空格,最后输出对应的k进制数。

输入样例:

4
5 3
123 16
0 5
-12 2

输出样例:

5 12
123 7B
0 0
-12 -1100

参考代码:

#include <stdio.h>
int main(){
    int n;    //测试组数
    scanf("%d", &n);
    int arr[100];
    int integer,k;    //整数 进制
    int count;    //记录位数
    for(int i=1;i<=n;i++){    //测试组数
        count=0;    //每组测试将位数初始化
        scanf("%d %d", &integer, &k);
        if(integer == 0){    //输入的整数为0时
            printf("%d 0\n", integer);
            continue;
        }
        printf("%d ", integer);
        
        int inte;
	    int p=0;    //数组下标
	    if(integer<0){
            printf("-");    //输入负号
     		integer=-integer;
    	}
    	while(integer>0){    //拆分
        	count++;
        	inte=integer;
        	inte%=k;    //余数
        	arr[p]=inte;    //余数储存到数组中
        	integer/=k;    //商
        	p++;
    	}
    	
        for(int j=count-1;j>=0;j--){    //结果输出
            if(arr[j]>=10){    //10~15分别用字母A、B、C、D、E、F表示
                switch(arr[j]){
                    case 10:
                        printf("A");
                        break;
                    case 11:
                        printf("B");
                        break;
                    case 12:
                        printf("C");
                        break;
                    case 13:
                        printf("D");
                        break;
                    case 14:
                        printf("E");
                        break;
                    case 15:
                        printf("F");
                        break;
                }
            }
			else{
				printf("%d", arr[j]);
			}  
        }
        printf("\n");
    }
    return 0;
}

       

        1.2:水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

参考代码:

#include<stdio.h>
#include<math.h>
int main(){
    int n;
    scanf("%d",&n);
    for(int i=pow(10,n-1);i<=pow(10,n)-1;i++){
        int sum=0;
        int temp=i;
        while(sum<=i && temp!=0){
            int every=1;
            int mod=temp % 10;
            for(int j=1;j<=n;j++){
                every*=mod;
            }
            sum+=every;
            temp/=10;
        }
        if(sum==i){
            printf("%d\n",i);
        }
    }
    return 0;
}

        1.3:字符串转换为整数

题目描述

输入一串字符“a12b345c”,将其中的数字字符转换为整数12345。

输入格式:

输入一串字符,长度小于10。

输出格式:

输出相应的整型数据。

输入样例:

在这里给出一组输入。例如:

a01c2b345c

输出样例:

在这里给出相应的输出。例如:

12345

参考代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int main() {
    char input[10];
    int result = 0;

    fgets(input, sizeof(input), stdin);
    input[strcspn(input, "\n")] = '\0';

    int count=0,v;
    for (int i = 0; i < strlen(input); ++i) {
        v=isdigit(input[i]);
        if (v) {
            count++;
        }
    }
    for (size_t i = 0; i < strlen(input); ++i) {
        if (input[i] >= '0' && input[i] <= '9') {
            result += (input[i] - '0') * pow(10,count-1);
            count--;
        }
    }
    printf("%d\n", result);
    return 0;
}

2.求素数

        2.1:判断素数

本题的目标很简单,就是判断一个给定的正整数是否素数。

输入格式:

输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于231的需要判断的正整数。

输出格式:

对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No

输入样例:

2
11
111

输出样例:

Yes
No

参考代码:

#include<stdio.h>
#include<math.h>
int isPrime(int n)
{
    int i;
    int flag=1;
    if(n==1) flag=0;
    else{
        for(i=2;i<=sqrt(n);i++){
            if(n%i==0){
                flag=0;
                break;
            }
        }
    }
    return flag;
}
int main()
{
    int N;
    int n;
    int i;
    scanf("%d",&N);
    for(i=1;i<=N;i++){
        scanf("%d",&n);
        if(isPrime(n)) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

        2.2:求素数

输入一个正整数n。判断2到n中有那些素数。输出的每一个素数占一行。

注意:请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

数据范围:
2<=n<=100000

输入格式:

输入一个正整数m。

输出格式:

输出素数,一行输出一个素数。

输入样例:

在这里给出一组输入。例如:

7

输出样例:

在这里给出相应的输出。例如:

2
3
5
7

参考代码:

#include<stdio.h>
int main(){
    int m,i,j;
    scanf("%d",&m);
    for(i=2;i<=m;i++){
        for(j=2;j<=i;j++){
            if(i%j==0){
                break;
            }
        }
        if(i==j){
            printf("%d\n",i);
        }
    }
     return 0;
}

        2.3:哥德巴赫猜想

哥德巴赫猜想:任何大于2的偶数可以分成两个素数之和(例如18=11+7),请验证哥德巴赫猜想。
编程提示:设偶数为n,将n分解成n1和n2且n=n1+n2,显然n1最大为n/2。
首先判断n1是否为素数,如果是,再判断n2是否为素数,如果是输出n=n1+n2。

输入格式:

输入一个偶数。

输出格式:

输出n=n1+n2的形式,如果有多个,一行输出一个。

输入样例:

在这里给出一组输入。例如:

44

输出样例:

在这里给出相应的输出。例如:

44=3+41
44=7+37
44=13+31

参考代码:

#include<stdio.h>
int main(){
    int n,n1,n2,i,j,sum;
    scanf("%d",&n);
    for(i=2;i<=n/2;i++){
        sum=0;
        n1=i;
        for(j=2;j<=n1;j++){
            if(n1%j==0){
                break;
            }
        }
        if(n1==j){
            sum+=n1;
        }
        else{
            continue;
        }
        n2=n-i;
        for(j=2;j<=n2;j++){
            if(n2%j==0){
                break;
            }
        }
        if(n2==j){
            sum+=n2;
        }
        else{
            continue;
        }
        if(n==sum){
            printf("%d=%d+%d\n",sum,n1,n2);
        }
    }
    return 0;
}

3.求最值

        3.1:找出最小值

本题要求编写程序,找出给定一系列整数中的最小值。

输入格式:

输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。

输出格式:

在一行中按照“min = 最小值”的格式输出n个整数中的最小值。

输入样例:

4 -2 -123 100 0

输出样例:

min = -123

参考代码:

#include<stdio.h>
int main() 
{
    int n;
    scanf("%d ",&n);
    int a[100] = {0};
    int i = 0;
    for (i = 0;i < n;i++){
        scanf("%d",&a[i]);
    }
    int min = a[0];
    for (i = 0;i < n;i++){
        if (a[i] < min){
            min = a[i];
        }
    }
    printf("min = %d",min);
}

        3.2:求最大字符串

题目描述

输入4个字符串,求最大字符串。

输入格式:

输入4个字符串,长度小于20。

输出格式:

输出最大字符串。

输入样例:

在这里给出一组输入。例如:

apple
banana
pear
orange

输出样例:

在这里给出相应的输出。例如:

pear

参考代码:

#include<stdio.h>
#include<string.h>
int main(){
    int i,j;
    char name[4][20];
    char temp[2][100];
    for (i=1;i<=4;i++)
        scanf("%s",&name[i]);
        strcpy(temp[1],name[1]);
    for (i = 1; i < 4; i++)
        if(strcmp(temp[1],name[i])<0)
            strcpy(temp[1],name[i]);
    printf("%s\n",temp[1]);
    return 0;
}

        3.3:找最长的字符串

本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。

输入格式:

输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式:

在一行中用以下格式输出最长的字符串:

The longest is: 最长的字符串

如果字符串的长度相同,则输出先输入的字符串。

输入样例:

5
li
wang
zhang
jin
xiang

输出样例:

The longest is: zhang

参考代码:

#include<stdio.h>
#include<string.h>
int main(){
	int N,n,max=0,t=0;
	scanf("%d",&N);
    char num[N][100];
    int num1[N];  //保存各个字符串的长度 
    for(int i=0;i<N;i++){
    	scanf("%s",num[i]);
    	num1[i]=strlen(num[i]);
    	if(max<num1[i]){
    		max=num1[i];
    		t=i;
		} 
	}
    printf("The longest is: %s",num[t]);
	return 0;
}

        3.4:找鞍点

题目描述

找出二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也有可能没有鞍点。

输入格式:

输入4行4列的整型二维数组。

输出格式:

若有鞍点,输入鞍点以及其位置;若没有鞍点,输出“It is not exist!”。

输入样例1:

在这里给出一组输入。例如:

2 3 9 5
6 7 8 3
0 5 7 5
2 1 8 3

输出样例1:

在这里给出相应的输出。例如:

a[2][2]=7

输入样例2:

在这里给出一组输入。例如:

2 3 9 5
6 7 8 3
1 5 6 7
2 1 8 3

输出样例2:

在这里给出相应的输出。例如:

It is not exist!

参考代码:

#include <stdio.h>
#define ROWS 4
#define COLS 4
int main() {
    int a[ROWS][COLS];
    int i, j, k;
    int maxRow[ROWS], minCol[COLS];
    // 输入二维数组
    for (i = 0; i < ROWS; ++i) {
        for (j = 0; j < COLS; ++j) {
            scanf("%d", &a[i][j]);
        }
    }
    // 找出每一行的最大值和每一列的最小值
    for (i = 0; i < ROWS; ++i) {
        maxRow[i] = a[i][0];
        for (j = 1; j < COLS; ++j) {
            if (a[i][j] > maxRow[i]) {
                maxRow[i] = a[i][j];
            }
        }
    }
    for (j = 0; j < COLS; ++j) {
        minCol[j] = a[0][j];
        for (i = 1; i < ROWS; ++i) {
            if (a[i][j] < minCol[j]) {
                minCol[j] = a[i][j];
            }
        }
    }
    // 检查是否存在鞍点
    int found = 0;
    for (i = 0; i < ROWS && !found; ++i) {
        for (j = 0; j < COLS && !found; ++j) {
            if (maxRow[i] == a[i][j] && minCol[j] == a[i][j]) {
                printf("a[%d][%d]=%d\n", i, j, a[i][j]);
                found = 1;
            }
        }
    }
    // 如果没有找到鞍点,则输出“It is not exist!”
    if (!found) {
        printf("It is not exist!\n");
    }

    return 0;
}

4.找完数

        4.1:求完数

一个数如果恰好等于它的因子之和,这个数称为“完数”。例如6的因子分别为 1、2、3,而6=1+2+3,因此6是“完数”。编程序找出制定正整数之内所有完数并输出。
编程提示:根据完数的定义可知,将一个数因式分解,所有因子之和等于该数即为完数。

输入格式:

输入一个正整数。

输出格式:

输出完数,一行输出一个完数。

输入样例:

在这里给出一组输入。例如:

1000

输出样例:

在这里给出相应的输出。例如:

6
28
496

参考代码:

#include <stdio.h>

int main() {
    int n, num, sum;
    scanf("%d", &n);
    for (num = 1; num <= n; num++) {
        sum = 0;
        for (int i = 1; i < num; i++) {
            if (num % i == 0) {
                sum += i;
            }
        }
        if (sum == num) {
            printf("%d\n", num);
        }
    }
    return 0;
}

        4.2:找完数

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30

输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

参考代码:

#include <stdio.h>
#include <math.h>
int main()
{
    int m, n;
    int i, j, k;
    int s, p, flag = 0;
    scanf("%d %d", &m, &n);
    for (i = m; i <= n; i++){
        s = 0;
        for (j = 1; j <= i / 2; j++){
            if (i % j == 0)
                s += j;
        }
        if (s == i){
            flag = 1;
            printf("%d = ", i);
            p = 0;
            for (j = 1; j <= i / 2; j++){
                if (i % j == 0){
                    p += j;
                    if (p != i)
                        printf("%d + ", j);
                    else
                        printf("%d\n", j);
                }
            }
        }
    }
    if (flag == 0)
        printf("None\n");
    return 0;
}

5.斐波那契数列

斐波那契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……。在数学上,斐波纳契数列以递推的方法定义为:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N)。计算斐波那契数列第n项的值。

输入格式:

输入一个大于等于1,小于等于60的整数n。

输出格式:

输出第n项的数列值,数列值为double类型,不输出小数位数。

输入样例:

20

输出样例:

6765

输入样例:

1

输出样例:

1

参考代码:

#include <stdio.h>
double fun(int n)
{
    double a[61];
    int i;
    a[1]=1;a[2]=1;
    for(i=3;i<=n;i++)
        a[i]=a[i-1]+a[i-2];
    return a[n];
}
int main()
{
    int n;
    scanf("%d",&n);
    printf("%.0f\n",fun(n));
    return 0;
}

6.序列求和

        6.1:求N分之一序列前N项和

本题要求编写程序,计算序列 1 + 1/2 + 1/3 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

6

输出样例:

sum = 2.450000

参考代码:

#include <stdio.h>
int main() {
    int N;
    double sum = 0.0;
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) {
        sum += 1.0 / i;
    }
    printf("sum = %f",sum);
    return 0;
}

        6.2:求简单交错序列前N项和

本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。

输入样例:

10

输出样例:

sum = 0.819

参考代码:

#include<stdio.h>
int main(){
    int N,S=1;
    double sum = 0;
    scanf("%d",&N);
    for (int i = 0;i < N;i++){
        sum += S * 1.0 / (3 * i + 1);
        S = -S;
    }
    printf("sum = %.3lf",sum);
    return 0;
}

        6.3:求分数序列前N项和

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

20

输出样例:

32.66

参考代码:

#include <stdio.h>

int main()
{
    int N;
    double fenzi=2;
    double fenmu=1;
    double sum=0.0;
    scanf("%d",&N);
    for(int i=1;i<=N;i++){
        double item=fenzi/fenmu;
        sum+=item;
        fenzi=fenzi+fenmu;
        fenmu=fenzi-fenmu;
    }
    printf("%.2lf\n",sum);
    return 0;
}

        6.4:求幂级数展开的部分和

已知函数ex可以展开为幂级数1+x+x*2/2!+x*3/3!+⋯+x*k/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。

输入格式:

输入在一行中给出一个实数x∈[0,5]。

输出格式:

在一行中输出满足条件的幂级数部分和,保留小数点后四位。

输入样例:

1.2

输出样例:

3.3201

参考代码:

#include<stdio.h>
#include<math.h>
int main(){
    float x,e=1.0,sum=1.0;
    scanf("%f",&x);
    for(int i=1;i<100;i++){
        sum *= x/(float)i;
        e += sum;
        if(sum<0.00001)
            break;
    }
    printf("%.4f",e);
    return 0;
}

7.排序(必考)

        7.1:冒泡法排序

将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>

void bubbling(int arr[],int k,int n){
    while(k--){
        for(int i=0;i<n-1;i++){
            if(arr[i]>arr[i+1]){
                int temp=arr[i+1];
                arr[i+1]=arr[i];
                arr[i]=temp;
            }
        }
    }
    return ;
}

int main(){
    int n,k;
    while(scanf("%d %d",&n,&k)!=2);
    int arr[n]; 
    for(int i=0;i<n;i++){
        while(scanf("%d",&arr[i])!=1);
    }
    bubbling(arr,k,n);      
    for(int i=0;i<n;i++){
        printf("%d",arr[i]);
        if(i!=n-1){
            printf(" ");
        }
    }
    return 0;
}

        7.2:利用选择法进行排序

题目描述

本题要求将给定的n个整数从大到小排序后输出。

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

在这里给出一组输入。例如:

5
3 5 6 1 2

输出样例:

在这里给出相应的输出。例如:

6 5 3 2 1

参考代码:

#include<stdio.h>
int main(){
    int n,i,j;
    int arr[100]={0};
    while(scanf("%d",&n)!=1);
    for(i=1;i<=n;i++){
        while(scanf("%d",&arr[i])!=1);
    }
    for(i=1;i<=n;i++){
        for(j=i+1;j<=n;j++){
            int t;
            if(arr[i]>arr[j]){
                t=arr[j];
                arr[j]=arr[i];
                arr[i]=t;
            }
        }
    }
    for(j=n;j>=1;j--){
        printf("%d",arr[j]);
        if(j!=1){
            printf(" ",arr[j]);
        }
    }
    return 0;
}

        7.3 :选看

#include<stdio.h>
#include<stdlib.h>
#include<time.h> 
#define MAXSIZE 10

//int count;

void initarr(int arr[],int length){
	for(int i=0;i<length;i++){
		arr[i]=rand()%10;//rand()是一个函数
	}//它会返回一个在[0, RAND_MAX]之间的随机整数
}

void showarr(int arr[],int length){
	for(int i=0;i<length;i++){
		printf("%d ",arr[i]);
	}
	printf("\n-------------------------\n");
}

//冒泡排序
void bubbling(int arr[],int length){
	int flag=1;
	//count=0;
	while(length-- && flag){
		flag=0;
		for(int i=0;i<length;i++){
			//count++;
			if(arr[i]>arr[i+1]){
				flag = 1;
				int temp=arr[i+1];
				arr[i+1]=arr[i];
				arr[i]=temp;
			}
		}
	}
}

//选择排序
void select(int arr[],int length){
	//count=0;
	for(int i=0;i<length;i++){
		int k=i;
		for(int j=i+1;j<length;j++){
			//count++;
			if(arr[k]>arr[j]){
				k=j;
			}
		}
		int temp=arr[i];
		arr[i]=arr[k];
		arr[k]=temp;
	}
}

//插入排序
void insert(int arr[],int length){
	//count=0;
	for(int i=1;i<length;i++){
		for(int j=i;j>=1 && arr[j]<arr[j-1];j--){
			//count++;
			int temp=arr[j];
			arr[j]=arr[j-1];
			arr[j-1]=temp;
		}
	}
}

int main(){
	srand((unsigned)time(NULL));
	//这行代码是用来设置随机数种子的 
	//srand 是设置种子的函数,它接受一个无符号整数作为参数
	//(unsigned)time(NULL) 返回当前时间的秒数
	//它被转换为一个无符号整数
	//作用是将当前时间作为种子
	//以确保随机数生成器的输出是随机的
	int arr[MAXSIZE];
	initarr(arr,MAXSIZE);
	showarr(arr,MAXSIZE);//打印数组 
	
	bubbling(arr,MAXSIZE);//冒泡 
	showarr(arr,MAXSIZE);
	//printf("count=%d\n",count);
	
	select(arr,MAXSIZE);//选择 
	showarr(arr,MAXSIZE);
	//printf("count=%d\n",count);
	
	insert(arr,MAXSIZE);//插入 
	showarr(arr,MAXSIZE);
	//printf("count=%d\n",count);
	return 0;
}

8.查找

        8.1:折半查找

题目描述

在一个有序的一维数组中,输入一个数,利用折半查找法找到该数是这个数组中的第几个数;如果该数不在数组中,则输出“No data!”

输入格式:

第一行输入一个整数n(1<=n<=15),表示该数组有几个数;第二行输入n个整型一维数组;第三行输入要查找的数。

输出格式:

如果找到该数,输出“It's position is 4!”;如果没有找到,输出“No data!”。

输入样例1:

在这里给出一组输入。例如:

5
-3 2 7 15 40
15

输出样例1:

在这里给出相应的输出。例如:

It's position is 4!

输入样例2:

在这里给出一组输入。例如:

4
0 3 6 9
5 

输出样例2:

在这里给出相应的输出。例如:

No data!

参考代码:

#include<stdio.h>

int binary_search(int arr[],int num,int sz){
    int left=0,right=sz-1;
    while(left<=right){
        int mid=left+(right-left)/2;
        if(arr[mid]>num){
            right=mid-1;
        }
        else if(arr[mid]<num){
            left=mid+1;
        }
        else{
            return mid;
        }
    }
    return -1;
}

int main(){
    int n,i,num;
    scanf("%d",&n);
    int arr[n];
    for(i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    scanf("%d",&num);
    int sz=sizeof(arr)/sizeof(arr[0]);
    int ret=binary_search(arr,num,sz);
    if(ret==-1){
        printf("No data!");
    }
    else{
        printf("It's position is %d!",ret+1);
    }
    return 0;
}

        8.2:顺序查找(老师说不考

输入格式:
第一行输入一个整数n,表示顺序表的元素个数。

第二行行输入n个数字,依次为表内元素值。

第三行输入一个要查找的值。

输出格式:
输出这个值在表中的位置。如果没有找到,输出NOT FOUND。

输入样例:

5
9 5 3 7 6
7

输出样例:

4

输入样例:

5
9 5 3 7 6
8

输出样例:

NOT FOUND

参考代码:摘自PTA顺序查找_pta 顺序表的查找操作-CSDN博客

#include <stdio.h>
#include <stdlib.h>
 
#define MAXSIZE 50
typedef int ElemType;
typedef struct
{
    ElemType *R;
    int length;
} SSTable;
 
// 初始化顺序表
void InitList(SSTable *L, int n)
{
    L->R = (ElemType *)malloc((n + 1) * sizeof(ElemType));
    if (!L->R)
    {
        exit(EXIT_FAILURE);
    }
 
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &L->R[i]);
    }
 
    L->length = n;
}
 
// 顺序查找
int SequentialSearch(SSTable *L, ElemType key)
{
    L->R[0] = key; // 设置哨兵
 
    int i = L->length;
    while (L->R[i] != key)
    {
        --i;
    }
 
    return i; // 如果i为0,表示查找失败
}
 
int main()
{
    SSTable L;
    int n, key, result;
 
    // 输入元素个数
    scanf("%d", &n);
 
    // 初始化顺序表
    InitList(&L, n);
 
    // 输入要查找的值
    scanf("%d", &key);
 
    // 进行顺序查找
    result = SequentialSearch(&L, key);
 
    // 输出结果
    if (result != 0)
    {
        printf("%d\n", result);
    }
    else
    {
        printf("NOT FOUND\n");
    }
 
    // 释放内存
    free(L.R);
 
    return 0;
}

9.约瑟夫环

        9.1:猴子选大王

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

参考代码:

#include<stdio.h>
int main(){
    int n;
    while(scanf("%d",&n)!=1);
    int monkey[n],sign=0,count=1,remain=n;
    for(int i=0;i<n;i++){
        monkey[i]=0;
    }
    while(remain>1){
        if(monkey[sign]==0 && count%3==0){
            monkey[sign]=1;
            count=1;
            remain--;
        }
        else if(monkey[sign]==0){
            count++;
        }
        sign++;
        sign=sign%n;
    }
    for(int j=0;j<n;j++){
        if(monkey[j]==0){
            printf("%d",j+1);
        }
    }
    return 0;
}

        9.2:约瑟夫环

(选自PTA 1-3 约瑟夫环_约瑟夫环pta-CSDN博客

(不会考这么难的,反正博主我看不太懂

N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。

输入格式:
输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。

输出格式:
按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。

输入样例:
在这里给出一组输入。例如:

7 3

输出样例:

3 6 2 7 5 1 4

参考代码:

#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
    int data;
    struct Node *next;
}LinkListNode;
 
LinkListNode* Createlist(int n)//创建链表
{
    LinkListNode *head,*p,*q;
    head = (LinkListNode*)malloc(sizeof(LinkListNode));
    head->data = 1;
    head->next = NULL;
    p = head;
    for(int i = 2;i <= n;i++)//从头结点开始依此赋值
    {
        q = (LinkListNode*)malloc(sizeof(LinkListNode));
        q->data = i;
        p->next = q;
        p = q;
    }
    p->next = head;//最后指向头结点,构成循环
    return head;
}
int main()
{
    int n,p;
   scanf("%d%d",&n,&p);
    int ret[n];//vistual会报错,可换成常量
    int i = 0;
    LinkListNode *head,*ptr,*q;
    head = Createlist(n);
    ptr = head;
    while(i<n)
    {
        for(int j = 1;j < (p-1);j++)
        {
            ptr = ptr->next;
        }
        q = ptr->next;
        ret[i] = q->data;
        ptr->next = q->next;
        free(q);
        ptr = ptr->next;
        i++;
    }
    for(int j = 0;j<n-1;j++)
    {
        printf("%d ",ret[j]);//此处有空格
    }
       printf("%d", ret[n - 1]);//最后一个值后无空格,单独输出
    return 0;
}

10.打印图形问题

        10.1:打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

参考代码:

#include<stdio.h>
int main(){
    char c;
    int num,hang=1;
    scanf("%d %c",&num,&c);
    num--;
    while(num>=2*(hang+2)){
        num-=2*(hang+2);
        hang+=2;
    }
    int row=hang;
    for(int i=1;i<=hang;i++){
        if(i<=hang/2){
            for(int j=1;j<=i-1;j++){
                printf(" ");
            }
            for(int j=1;j<=row;j++){
                printf("%c",c);
            }
            row-=2;
        }
        else{
            for(int j=1;j<=hang-i;j++){
                printf(" ");
            }
            for(int j=1;j<row+1;j++){
                printf("%c",c);
            }
            row+=2;
        }
        printf("\n");
    }
    printf("%d",num);
    return 0;
}

        10.2:打印菱形图案

本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:

输入在一行中给出一个正的奇数n。

输出格式:

输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

      * 
    * * * 
  * * * * * 
* * * * * * * 
  * * * * * 
    * * * 
      * 

参考代码:

#include <stdio.h>
int main() {
    int n;
    scanf("%d",&n);
    for (int i=1;i<=(n+1)/2;i++){
        for(int j=1;j<=(n+1)/2-i;j++){
            printf("  ");
        }
        for(int j=1;j<=2*i-1;j++){
            printf("* ");
        }
        printf("\n");
    }
    for (int i=1;i<=(n-1)/2;i++){
        for (int j=1;j<=i;j++){
            printf("  ");
        }
        for (int j=1;j<=n-(2*i);j++){
            printf("* ");
        }
        printf("\n");
    }
    
    return 0;
}

       

        10.3:输出倒三角图案

本题要求编写程序,输出指定的由“*”组成的倒三角图案。

输入格式:

本题目没有输入。

输出格式:

按照下列格式输出由“*”组成的倒三角图案。

* * * *
 * * *
  * *
   *

参考代码:

#include<stdio.h>
int main(){
    int i,j;
    for(i=0;i<4;i++){
        for(j=0;j<i;j++){
            printf(" ");
        }
        for(j=i;j<4;j++){
            printf("*");
            if(j<3){
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

11.转置矩阵

题目描述

已知N×N的矩阵A,将A与矩阵A的转置矩阵相加,存放在矩阵B中。

输入格式:

第一行输入整数N(2<=N<=10)表示个N×N的整型矩阵;然后输入N×N个整数,中间以空格间隔。

输出格式:

输出矩阵B。

输入样例:

在这里给出一组输入。例如:

3
2 4 6
8 10 12
14 16 18

输出样例:

在这里给出相应的输出。例如:

   4  12  20
  12  20  28
  20  28  36

参考代码:

#include<stdio.h>
int main(){
    int a[10][10],b[10][10],n,i,j,t;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        for(j=0;j<n;j++) 
            scanf("%d",&a[i][j]);
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++) 
            b[i][j]=a[i][j]+a[j][i];
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("  %2d",b[i][j]);
        }
    printf("\n");
}
    return 0;
}

12.杨辉三角

题目描述

打印杨辉三角。

输入格式:

输入要打印的行数。0<n<14

输出格式:

输出杨辉三角。注:每个数字设置6个域宽。

输入样例:

在这里给出一组输入。例如:

5

输出样例:

在这里给出相应的输出。例如:

                 1
              1     1
           1     2     1
        1     3     3     1
     1     4     6     4     1

参考代码:

#include<stdio.h>
#define N 14
int main(){
    int n;
    scanf("%d",&n);
    int i,j,k,a[N][N];
    for(i=1;i<=n;i++){
        a[i][1]=a[i][i]=1;
    }
    for(i=3;i<=n;i++){
        for(j=2;j<=i-1;j++){
            a[i][j]=a[i-1][j-1]+a[i-1][j];
        }
    }
    
    for(i=1;i<=n;i++){
        for(k=1;k<=n-i;k++){
            printf("   ");
        }
        for(j=1;j<=i;j++){
            printf("%6d",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

13.老师所讲的pta第五章实验题(除魔方阵

        13.1:安工 pta 第五章作业与实验(C语言) 7-17 字符串转换为整数_输入一串字符“a12b345c”,将其中的数字字符转换为整数12345。输入格式:输入-CSDN博客

        13.2:

安工 pta 第五章作业与实验(C语言) 7-14 统计字符出现的次数_pta输入一串字符,统计其中大写字母a-z各出现多少次,输出出现过的字母(每5个字母占-CSDN博客

        13.3:

安工 pta 第五章作业与实验(C语言) 7-18 统计平均成绩_计算平均成绩c语言pta-CSDN博客

        13.4:

安工 pta 第五章作业与实验(C语言) 7-11 合并数组_pta作业合并数组-CSDN博客

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩荩さん!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值