首页 > 编程语言 >c语言编程题

c语言编程题

时间:2024-03-22 19:55:44浏览次数:28  
标签:10 语言 int scanf 编程 ++ 测试 include

1.密码破译

要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母。
例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。

测试输入:China

测试输出:Glmre

#include <stdio.h>
int main(){
    char s[11];                             
    gets(s);                                //输入字符串
    for (int i = 0; s[i] != '\0'; i++){
        if (s[i] >= 'A' && s[i] <= 'Z'){             //判断是否为大写字母
            s[i] = (s[i] + 4 - 'A') % 26 + 'A';     //大写字母后移
        }
        if (s[i] >= 'a' && s[i] <= 'z'){             //判断是否为小写字母
            s[i] = (s[i] + 4 - 'a') % 26 + 'a';     //小写字母后移
        }
    }
    puts(s);                                //输出字符串
    return 0;
}

2.最大公约数与最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数。

测试输入:12,8

测试输出:4,24

#include <stdio.h> 
int main(){
    int n, m, r, p;
	scanf("%d,%d", &n, &m);
	if(n < m){	//确保 n 比 m 大 
		int temp = n;
		n = m;
		m = temp;
	} 
	p = n * m;
	while(m != 0){
		r = n%m;
		n = m;
		m = r;
	}
	
	printf("最大公约数为: %d\n", n);
	printf("最小公倍数为: %d\n", p/n);
	return 0;
}

3.字符统计

输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

测试输入:aklsjflj123 sadf918u324 asdf91u32oasdf/.';123

测试输出:字母数:23,数字数:16,空格数:2,其他数:4

方法一:利用 getchar() 输入字符。

#include <stdio.h>
int main(){
    int letter = 0, number = 0, space = 0, other = 0;
    char ch;
     
    while((ch = getchar()) != '\n'){   //读入字符  
        if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
            letter ++;   
        else if (ch == ' ')
            space ++;  
        else if (ch >= '0' && ch <= '9')
            number ++; 
    	else
            other ++;  
    }
    printf("字母数:%d,数字数:%d,空格数:%d,其他数:%d", letter, number, space, other);
     
    return 0;
}

方法二:利用 gets() 输入字符串。

#include <stdio.h>
#include <string.h>
char str[200];
int main(){
    int letter = 0, number = 0, space = 0, other, n;
    gets(str); 
    n = strlen (str); 
    
    for(int i = 0; i < n; i++){
        if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))
            letter ++;
        else if (str[i] == ' ')
            space ++;
        else if (str[i] >= '0' && str[i] <= '9')
            number ++;
		else 
			other++;  
    }
    printf("字母数:%d,数字数:%d,空格数:%d,其他数:%d", letter, number, space, other);
     
    return 0;
}

4.求和1

求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如: a为2,n=5时,Sn=2+22+222+2222+22222,a,n由键盘输入。

测试输入:2 5

测试输出:24690

#include <stdio.h>
int main(){
    int a, n, sn = 0, temp = 0;
    scanf("%d %d", &a, &n);
    for(int i = 0; i < n; i++){
    	temp += a;
    	sn += temp;
    	a *= 10;
	}
    printf("%d\n", sn);
    return 0;
}

5.求和2

求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。

#include <stdio.h>
int main(){
    int n;
    long long Sn = 0, temp = 1;
    scanf("%d", &n); 
     
    for (int i = 1; i <= n; i++){
        temp = temp * i;
        Sn = Sn + temp;
    }
    printf("%lld", Sn); 
    return 0;
}

6.求和3

求以下三数的和, 1a之和,1b的平方和,1~c的倒数和。a,b,c 由键盘输入,保留2位小数。

测试输入:100 50 10

image-20240313162529867

测试输出:47977.93

#include <stdio.h>
int main(){
    int a, b, c;
    double sum1 = 0, sum2 = 0 , sum3 = 0;
    scanf("%d %d %d", &a, &b, &c); 
     
    for (int i = 1; i <= a; i++)
    	sum1 += i;
 	for (int i = 1; i <= b; i++)
    	sum2 += i * i;
    for (double i = 1; i <= c; i++)//i作分母,使用double类型 
    	sum3 += 1/i;
    	
    printf("%.2lf", sum1 + sum2 + sum3); 
    return 0;
}

7.水仙花数

打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=13+53+3^3。

测试输入:无

测试输出:无

#include<stdio.h>
int main(){
    int a,b,c;
    for(int i=100; i<1000; i++){
        a = i / 100;	//百位 
        b = i / 10 % 10;	//十位 
        c = i % 10; 	//个位 
        if(a*a*a + b*b*b + c*c*c == i)
            printf("%d ",i);
    }
    return 0;
}

8.完数

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子。

测试输入:1000

测试输出:6 its factors are 1 2 3

​ 28 its factors are 1 2 4 7 14

​ 496 its factors are 1 2 4 8 16 31 62 124 248

#include <stdio.h>
 
int main(){
    int N, sum = 0;
    scanf( "%d", &N );
 
    for ( int i = 2; i <= N; i++ ){
        for ( int j = 1; j <=i/2; j++ ){
            if ( i % j == 0 )
                sum = sum + j;
        }
 
        if ( sum == i ){
            printf( "%d its factors are ", i );

            for ( int k = 1; k <=i/2; k++ ){
                if ( i % k == 0 )
                    printf( "%d ", k );
            }
            printf( "\n" );
        }
        
        sum = 0;
    }
    return 0;
}

9.求和4

有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。

测试输入:10

测试输出:16.48

#include<stdio.h>

int main(){
	int n;
    double sum = 0, a = 2.0, b = 1.0, t;//a为分子,b为分母
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++){
    	sum += a / b;
        t = a;
        a = a + b;
        b = t;
    }
    
    printf("%0.2lf", sum);
    return 0;
}

10.自由下落的距离计算

一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数。M, N由键盘输入。

测试输入:1000

测试输出:5

#include<stdio.h>

int main(){
	double M, N;
	scanf("%lf %lf", &M, &N);
	double sum = M, h = M/2;
	for(int i = 1; i < N; i++){
		sum += 2*h;
		h = h/2;
	}
	printf("%lf %lf", h, sum);
	
    return 0;
}

11.猴子吃桃

猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

测试输入:10

测试输出:1534

# include <stdio.h>
 
int main()
{
    int sum = 1, n;
    scanf("%d", &n);
    while(n > 1){	//注意循环 n-1 次, 不是n次
    	sum = (sum + 1) * 2;
    	n--;
	}
    printf("%d", sum);
 
    return 0;
}

12.迭代法求平方根

用迭代法求 平方根。

公式:求a的平方根的迭代公式为: X[n+1]=(X[n]+a/X[n])/2 要求前后两次求出的差的绝对值少于0.00001。 输出保留3位小数。

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

int main(){
    double a, x0, x1;
    scanf("%lf", &a);
    x0 = a/2;
    x1 = (x0 + a/x0)/2;  
    
    while(fabs(x1-x0) > 1e-5){
    	x0 = x1;
		x1 = (x0 + a/x0)/2;    
    }
    
    printf("%0.3lf", x1);
    return 0;
}

13求N以内的素数

求N以内的素数。

测试输入:10

测试输出:

2
3
5
7

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

int main(){
    int N, isPrime = 1;	
    scanf("%d", &N);
    
    for(int i = 2; i <= N; i++){//因为 1 不是素数,i 从 2 开始
        isPrime = 1;                
        for(int j = 2; j <= sqrt(i); j++){
            if(i % j == 0){
            	isPrime = 0;
			}      
        }
        if(isPrime == 1)            
            printf("%d\n", i);
    }
    return 0;
}

14.选择排序

输入10个数,用选择法对10个整数从小到大排序。

测试输入:4 85 3 234 45 345 345 122 30 12

测试输出:3 4 12 30 45 85 122 234 345 345

#include <stdio.h>

void Select_Sort(int a[], int len) {
	int min, temp;
	
    for (int i = 0 ; i < len - 1 ; i++){
        min = i;                  // 记录最小值,第一个元素默认最小
        for (int j = i + 1; j < len; j++){     // 访问未排序的元素
            if (a[j] < a[min]){    // 找到目前最小值
                min = j;    // 记录最小值
            }
        }
        
        if(min != i){
            temp = a[min];  // 交换两个变量
            a[min] = a[i];
            a[i] = temp;
        }
    }
}

int main(){
    int a[10];
	for(int i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	
	Select_Sort(a, 10);
	
	for(int i = 0; i < 10; i++)
		printf("%d ", a[i]);
		
	return 0;
}

15.冒泡排序

输入10个数,用选择法对10个整数从小到大排序。

测试输入:4 85 3 234 45 345 345 122 30 12

测试输出:3 4 12 30 45 85 122 234 345 345

#include <stdio.h>

void Bubble_Sort(int a[], int len){
    int temp;
    for (int i = 0; i < len - 1; i++){
    	for (int j = 0; j < len - 1 - i; j++){
    		if (a[j] > a[j + 1]){
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
		}
	}
}

int main(){
    int a[10];
	for(int i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	
	Bubble_Sort(a, 10);
	
	for(int i = 0; i < 10; i++)
		printf("%d ", a[i]);
		
	return 0;
}

16.直接插入排序

输入10个数,用选择法对10个整数从小到大排序。

测试输入:4 85 3 234 45 345 345 122 30 12

测试输出:3 4 12 30 45 85 122 234 345 345

#include <stdio.h>

void Insert_Sort(int a[], int len){
    int temp, j;//将 j 定义在for循环外,后面要用到 j 
    for (int i = 1; i < len; i++){
        temp = a[i];
        for (j = i; j > 0 && a[j-1] > temp; j--){
            a[j] = a[j-1];
		}
        a[j] = temp;
    }
}

int main(){
	int a[10];
	for(int i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	
	Insert_Sort(a, 10);
	
	for(int i = 0; i < 10; i++)
		printf("%d ", a[i]);
		
	return 0;
}

17.二分查找(折半查找)

查找 target 在有序数组中的下标。数组长度n,有序数组中的n个元素,target 均由键盘输入。

测试输入1:

4

1 2 3 4

4

测试输出1:4在数组中的下标为3

测试输入2:

4

1 2 3 4

0

测试输出2:数组中不存在0

#include <stdio.h>

int a[100];

int search(int a[], int n, int target){ //a是数组,n是数组a的大小,target是需要查找的值
    int left = 0, right = n - 1;
    
    while (left <= right){	//当left <= right时,区间 [left, right]有效 
        int mid = (right + left) / 2;
        if (a[mid] > target){
            right = mid - 1;	//target在左区间 [left, mid - 1]
        } 
		else if (a[mid] < target){
            left = mid + 1;	//target在右区间 [mid + 1, right]
        } 
		else{	//既不在左边,也不在右边,那就是找到答案了
            return mid; //返回的是 target在数组中的位置 
        }
    }
    //循环结束都没有找到目标值,说明数组中没有 target
    return -1;
}

int main(){
	int n, target, pos;
	scanf("%d", &n);

	for(int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	scanf("%d", &target);
	
	pos = search(a, n, target);
	if(pos == -1)
		printf("数组中不存在%d\n", target);
	else 
		printf("%d在数组中的下标为%d\n", target, pos);
	
	return 0;
}

18.矩阵对角线求和

输入一个3×3矩阵,求主对角线元素之和与副对角线元素之和。

测试输入:

1 2 3
1 1 1
3 2 1

测试输出:

主对角线之和为 3
副对角线之和为 7

#include<stdio.h>
int main(){
    int a[3][3];
    int sum1 = 0, sum2 = 0;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            scanf("%d", &a[i][j]);
        }
    }
    
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            if(i == j)	//主对角线 
                sum1 += a[i][j];
            if(i + j == 2)	//副对角线 
                sum2 += a[i][j];
        }
    }
    
    printf("主对角线之和为 %d\n副对角线之和为 %d\n", sum1, sum2);
    return 0;
}

19.数组插入

已有一个已正序排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。

测试输入:
1 7 8 17 23 24 59 62 101
50

测试输出:

1 7 8 17 23 24 50 59 62 101

#include<stdio.h>

int main(){
	int a[10], num;
    for(int i = 0; i < 9; i++)
    	scanf("%d", &a[i]);
    scanf("%d", &num);
	
	int j;
    for (j = 9; j > 0 && a[j-1] > num; j--){ //直接插入排序的思想 
        a[j] = a[j-1];	//元素后移 
	}
    a[j] = num;	
    
    for(int i = 0; i < 10; i++)
    	printf("%d ", a[i]);
    	
    return 0;
}

20.数字逆序输出

输入n个数字,然后逆序输出。

测试输入:

10

1 2 3 4 5 6 7 8 9 0

测试输出:

0 9 8 7 6 5 4 3 2 1

#include<stdio.h>

int a[100];

int main(){
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	for(int i = n-1; i >= 0; i--)
		printf("%d ", a[i]);
    	
    return 0;
}

21.二维数组转置

写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。

测试输入:

1 2 3
4 5 6
7 8 9

测试输出:

1 4 7
2 5 8
3 6 9

#include<stdio.h>

int a[3][3]; 

void convert(int a[][3]){//注意二维数组作为形参,列数不能省略 
	int temp;
	for(int i = 0; i < 3; i++){
        for(int j = i + 1; j < 3; j++){ //j从i + 1开始, 将矩阵上对角线元素与下对角线元素交换 
            temp = a[i][j];
            a[i][j] = a[j][i];
            a[j][i] = temp;
        }
    }
}

int main(){
    for(int i = 0; i < 3; i++){	//输入二维数组 
        for(int j = 0; j < 3; j++){
            scanf("%d", &a[i][j]);
        }
    }
    
    convert(a);
    
    for(int i = 0; i < 3; i++){	//输出二维数组
        for(int j = 0; j < 3; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

22.字符串反转

写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

测试输入:123456abcdef

测试输出:fedcba654321

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

char str[100];
 
void inverse(char str[]){
    int temp, len = strlen(str);	//len为字符串长度 
    for(int i = 0; i < len/2; i++){
        temp = str[i];
        str[i] = str[len-i-1];
        str[len-i-1] = temp;
    }
}
 
int main(){
    gets(str);
    inverse(str);
    puts(str);
    return 0;
}

23.字符串连接

写一函数,将两个字符串连接。

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

char s1[100], s2[100], s[200];//连接s1,s2,将结果存入s 
 
void concatenate(char s1[], char s2[], char s[]){ 
	int k = 0; //k为s的下标 
    for(int i = 0; s1[i] != '\0'; i++)
        s[k++] = s1[i];
    for(int i = 0; s2[i] != '\0'; i++)
        s[k++] = s2[i];
    s[k] = '\0'; //在结尾加上结束符 
}
 
int main(){
    gets(s1);
    gets(s2);
    concatenate(s1, s2, s);
    puts(s);
    return 0;
}

24.数字分离

写一函数,输入一个 n 位数字,要求输出这 n 个数字字符,但每两个数字间空格。如输入1990,应输出"1 9 9 0"。

测试输入:1990

测试输出:1 9 9 0

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

char num[100];
 
void function(char num[]){
	int len = strlen(num);
	for(int i = len; i > 0; i--){
		num[2*i] = num[i];
		num[2*i - 1] = ' ';
	} 
}
 
int main(){
    gets(num);
    function(num);
    puts(num);
    return 0;
}

25.整数处理

输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。

测试输入:2 1 3 4 5 6 7 8 10 9

测试输出:1 2 3 4 5 6 7 8 9 10

#include <stdio.h>

int a[10];

void input(int a[]){ //输入函数 
	for(int i = 0; i < 10; i++)
		scanf("%d", &a[i]);
} 

void deal(int a[]){ //处理函数 
	int temp, max = 0, min = 0;//max和min分别记录最大值和最小值的下标
	for(int i = 0; i < 10; i++){
		if(a[max] < a[i])
			max = i;
	} 
	for(int i = 0; i < 10; i++){
		if(a[min] > a[i])
			min = i;
	} 
	
	temp = a[0];//将最小的数与第一个数交换
	a[0] = a[min];
	a[min] = temp; 
	
	temp = a[9];//将最大的数与最后的数交换
	a[9] = a[max];
	a[max] = temp; 
	
} 

void output(int a[]){ //输出函数 
	for(int i = 0; i < 10; i++)
		printf("%d ", a[i]);
} 

int main(){
    input(a);
    deal(a);
    output(a);
    return 0;
}

26.数字后移

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。

测试输入:

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

测试输出:9 10 1 2 3 4 5 6 7 8

#include <stdio.h>

int a[100], b[100];

void function(int a[], int n, int k){
	int temp;
	for(int i = 0; i < n; i++)
		b[(i+k)%n] = a[i];
	for(int i = 0; i < n; i++)
		a[i] = b[i];
}

int main(){
	int n, k;	//n 个数,后移 k 位 
	scanf("%d", &n);
    for(int i = 0; i < n; i++){
    	scanf("%d", &a[i]);
	}
	scanf("%d", &k);
	
	function(a, n, k);
	
	for(int i = 0; i < n; i++){
    	printf("%d ", a[i]);
	}
	
    return 0;
}

27.字符串拷贝

有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。键盘上输入顺序为:数字n 一行字符串 数字m。

测试输入:

6
abcdef
3

测试输出:cdef

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

char s1[100], s2[100];

void copy(char s1[], char s2[], int n, int m){
	int k = 0;
	for(int i = m-1; i < n; i++)
		s2[k++] = s1[i];
	s2[k] = '\0';
}

int main(){
    int n, m;
    scanf("%d", &n);
    getchar();	//吞掉输入n之后的回车,不然回车会赋值给s1 
    gets(s1);
    scanf("%d", &m);
    
    copy(s1, s2, n ,m);
    puts(s2);
    
    return 0;
}

28.第几天(使用结构体)

定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。

测试输入:2000 12 19

测试输出:是第354天

#include <stdio.h>

int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//每个月的天数 

struct y_m_d{	//定义年月日结构体 y_m_d 
	int year;
	int month;
	int day;
}data;	//定义一个结构体变量,变量名为data,相当于 y_m_d data 
//其中 y_m_d相当于数据类型, data为变量名 

int main(){
	int day_sum = 0; 
	scanf("%d %d %d", &data.year, &data.month, &data.day);//输入年月日
	if(data.year % 4 == 0)	//如果是闰年,2月就要改成29天 
		mon[1] = 29; 
	
	for(int i = 0; i < data.month - 1; i++)//计算第几天
		day_sum += mon[i]; 
	day_sum += data.day;
	
	printf("是第%d天", day_sum);
} 

29.结构体之成绩统计1

现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,读取N条记录输入,再按要求输出。 N<100

测试输入:

2
a100 clang 70 80 90
b200 dotcpp 90 85 75

测试输出:

a100,clang,70,80,90,
b200,dotcpp,90,85,75,

#include <stdio.h>

const int N = 100;

struct student{
	char num[10]; //学号
	char name[10]; //姓名
	int score[3]; //三科成绩 
}stu[N]; 

void input(int n){	//输入函数 
	for(int i = 0; i < n; i++){
		scanf("%s", stu[i].num);// gets(stu[i].num) 
		scanf("%s", stu[i].name);// gets(stu[i].name) 
		for(int j = 0; j < 3; j++)
			scanf("%d", &stu[i].score[j]); 
	}
}

void print(int n){	//输出函数 
	for(int i = 0; i < n; i++){
		printf("%s,%s,", stu[i].num, stu[i].name);
		for(int j = 0; j < 3; j++)
			printf("%d,", stu[i].score[j]); 
		printf("\n"); 
	} 
}

int main(){
	int n;
	scanf("%d", &n);
	input(n);
	print(n);
	return 0;
} 

30.结构体之成绩统计2

有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩、平均分)。

测试输入:

1 a 100 100 100
2 b 90 90 100
3 c 90 100 90
4 d 100 90 90
5 c 100 100 98
6 e 99 98 87
7 ee 99 100 89
10 f 89 87 86
8 bw 10 9 8
9 o 100 0 100

测试输出:

3门课程的总平均分为 83.30
最高分学生数据为:
学号:a,姓名:a,成绩:100 100 100,平均成绩:100.00

#include <stdio.h>

const int N = 10;

struct student{
	char num[10]; //学号
	char name[10]; //姓名
	int score[3]; //三科成绩 
	double aver; //平均成绩 
}stu[N]; 

int main(){
	 //输入学生数据 
	double sum; 
    //sum记录每个学生的三科成绩总分,用来求该学生平均分
	for(int i = 0; i < N; i++){
		scanf("%s", stu[i].num);
		scanf("%s", stu[i].name);
		sum = 0; 
		for(int j = 0; j < 3; j++){
			scanf("%d", &stu[i].score[j]); 
			sum += stu[i].score[j];
		}
		stu[i].aver = sum/3.0;  
	} 
	
	//计算总平均分
	double sum_aver = 0, aver = 0;
    //sum_aver为所有学生的平均分之和,aver为要输出的总平均分
	for(int i = 0; i < N; i++)
		sum_aver += stu[i].aver;
	aver = sum_aver / N;
	printf("3门课程的总平均分为 %.2lf\n", aver);
	
	//输出最高分学生数据
	double max = stu[0].aver;
	int max_i = 0;
    //max记录最高平均分,max_i记录最高分学生下标
	for(int i = 0; i < N; i++){
		if(stu[i].aver > max){
			max = stu[i].aver;
			max_i = i;
		}
	}
	
	printf("最高分学生数据为:\n");
	printf("学号:%s,姓名:%s,成绩:%d %d %d,平均成绩:%.2lf",
			stu[max_i].name, stu[max_i].name, 
			stu[max_i].score[0], stu[max_i].score[1], stu[max_i].score[2], stu[max_i].aver);

	return 0;
} 

31.约瑟夫环(数组版)

n个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从1开始报数,数到 m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

例如 n=13, m=3 时,13个人围成一圈,从第一个人开始顺序报号1,2,3,凡报到 3 者退出圈子,接着下一个人从1开始重新报数,直到所有人退出圈子。

测试输入:13 3

测试输出:3 6 9 12 2 5 8 11 1 4 7 10 13

#include <stdio.h>

const int N = 100;
int st[N];	//标记是否出圈 

int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	
	int surplus =  n;	//surplus为圈中剩余人数 
	int i = 0, count = 1;//count为报数,i为第i个人,i从0开始 
	while(surplus > 0){
		if(st[i] == 1) //跳过 
			i++;
		else{
			if(count == m){ //出圈 
				st[i] == 1;
				surplus--;
				printf("%d ", i+1);
				count = 1; //重新计数 
				i++;
			}
			else{
				count++;
				i++;
			}
		}
		
		if(i == n) i = 0; 
	}
	
	return 0;
} 

32.约瑟夫环(静态循环链表版)

#include <stdio.h>

const int N = 100;

struct person{
	int number;
	int next;
}link[N];

int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	
	//创建循环链表
	for(int i = 1; i <= n; i++){
		link[i].next = i+1;
		link[i].number = i;
	}
	link[n].next = 1; //最后一个元素的next指针指向第一个元素 
	
	int surplus = n;	//surplus为圈中剩余人数 
	int h = 1, count = 1; //count为报数,h为第h个人
	while(surplus > 0){	
		if(link[h].number == 0) //跳过 
			h = link[h].next;
		else{
			if(count == m){	//出圈 
				printf("%d ", link[h].number);
				link[h].number = 0; //标记为已出圈
				surplus--;
				count = 1;	//重新计数
				h = link[h].next;
			}
			else{
				count++;
				h = link[h].next;
			}
		}
	}
	
	return 0;
} 

标签:10,语言,int,scanf,编程,++,测试,include
From: https://www.cnblogs.com/bwtyt/p/18090333

相关文章

  • 【C语言】结构体详解
    文章目录1、前言2、结构体变量的创建和初始3、结构体的特殊声明3、结构体的自引用5、结构体的内存对齐5.1对齐规则5.2为什么存在内存对齐?5.3修改对齐数6、结构体实现位段6.1什么是位段6.2位段的内存分配6.3位段的跨平台问题6.4位段的应用6.5位段使用的注意事项......
  • 各大编程语言输出Hello World
    下面小编就开始编写C++,Java,Go,PHP,Python的简单实例代码C++#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld"<<endl;return0;}这是一个简单的C++程序,用于输出"HelloWorld"到控制台。下面是对这段代码的逐行解析:#include<io......
  • [C++提高编程](一):模板----函数模板
    目录函数模板作用函数模板的语法注意事项普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性案例--通用数组选择排序从大到小模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。函数模板作用建立一个通用函数,其函数返回值类型......
  • 幸运儿(C语言)
    前期做了1篇循环数循环数(模拟(C语言))-CSDN博客的题解,虽然看的人不是很多,但觉得能帮到一部分编程初学者和爱好者也非常不错本次做的这篇文章也是一道模拟题(难易区别不好说,感觉因人而异)问题描述n个人围成一圈,并依次编号1~n,。从编号为1的人开始,按顺时针方向每隔一人选出一个,剩......
  • R语言数据质量分析
    R语言数据质量分析数据质量分析是数据预处理的前提,也是数据分析结论有效性和准确性的基础。数据质量分析的主要任务是检查原始数据中是否存在脏数据。脏数据一般包括;缺失值分析缺失值产生的原因、影响原因:部分信息难以获取,或获取的代价太大因人为因素遗漏的、忘记......
  • Java编程经典例题|水仙花数
     一、题目描述水仙花数(NarcissisticNumber)也被称为阿姆斯特朗数(ArmstrongNumber),它是一个n位数,其各位数字的n次方之和等于该数本身。例如,对于三位数的水仙花数,其定义是:一个三位数,它的每个位上的数字的3次幂之和等于它本身。例如,153是一个水仙花数,因为1^3+5^3+3^3=153......
  • 深入了解C语言中浮点数的存储方式
    因为这期可能对你们来说太简单了,所以我用一个字来概括吧好了,结束了,我们下期再见喽,不会有人真的走了吧,好了,砸门多的不说少的不闹好吧,直接上主食。1.浮点数和整数在内存中存储的区别浮点数和整数在内存中存储的区别主要体现在数据表示和存储方式上:1.数据类型:  -整数(in......
  • python异步编程
    1、协程1.1协程是什么协程不是计算机提供,程序员人为创造。协程(Coroutine)也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。线程是通过时间片抢占来执行程序的,相比与线程的抢占式调度协程de协作式调度是程序自身......
  • 2021-10-22-go语言基础
    概述、变量、常量、运算符和函数、导包、指针、defer、数组、切片、map、type使用、面向对象、反射、chanel、协程、json操作、随机数、网络编程、读取文件、beego概述1特性:自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发......
  • 2020-7-28-并发编程
    概述、生产者消费者模型、锁对象、集合的线程安全问题、Callable的使用、计数器、队列、线程池、ForkJoin、异步回调、单例模式、CAS、锁概述1多线程下变量访问存在问题变量访问不可见性2JMM特点所有共享变量存于主内存中每个线程有自己的工作内存线程对变量的操作都必须在......