C语言重点练习题之数组篇

1.约瑟夫环

1、一群人围在一起坐成环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,他的下一个人又从1开始报数,数到M的那个人又出列
4、一直循环,直到所有人出列,约瑟夫环结束

提示:N个人,其编号从1到N,存储在数组元素a中。从a[0]开始报数,数到M的数组元素a[i],存储到b[j++]中,然后把a[i]标记为0或-1,表示已经出列,下次要跳过。当走到数组末尾a[N-1]是,再从头开始接着报数(模拟成一圈)。当所有元素都标记为0时,表示都出列了,打印数组b的值,即为结果。

#include<stdio.h>
int JosephRing(int n,int m)
{
	int flag[n],win_flag = 0;  //定义flag为游戏状态,win_flag为赢的人的位置
	int count = 0, num = 0;    //定义淘汰的人数计数器,和计数器
	for(int i = 1; i <= n; i++) // 将flag置为1,游戏开始
	  flag[i] = 1;
	while(count < n-1){        //判断淘汰的人数都没到参加的人数
		for(int i = 1; i <= n;i++){
			if(flag[i] == 1){
				num++;	        //报数
				if(num == m){        //判断记得数与要淘汰的数进行比较
					//printf("%d\n",i);
					flag[i] = 0;
					count++;
					num = 0;      //淘汰完之后,重新从下一个人由1开始报
				}
				if(count == n-1){  //如果到了最后一个人,退出循环,游戏结束
					break;
				}
			}
		}
	}
	for(int i = 1; i <= n; i++){
		if(flag[i] == 1){
			win_flag = i;    //将赢的人的位置返回主函数
			return win_flag;
		}
	}
}
int main()
{
	int m,n,winner;	
	printf("输入如参加的人数N和报的数M:\n");
	scanf("%d%d",&n,&m);
	winner = JosephRing(n,m);
	printf("最终的赢家为第%d个人!\n",winner);
	return 0;
}

2.有100个数字的数组分别是1~100,现在要求用二分查找去找一个数(自己输入),要求找出这个数字的下标及查找了几次

#include<stdio.h>
int Init_array(int arr[]){      //初始化数组
	int num = 1;
	for(int i = 0; i < 100; i++){
		arr[i] = num;
		num++;
	}
}

int binary_rearch(int *arr,int n){      //二分查找
	int count = 0,max,min,mid,len = 100;
	int sub;
	max = arr[len-1]; min = arr[0];
	while(min <= max){
		mid = (max+min)/2;
		count++;
	    if(n < arr[mid]){
			max = mid-1;
		}
		else if(n > arr[mid]){
			min = mid+1;
		}
		else {
			sub = mid;
			printf("该数的下标为:arr[%d],共查找了%d次!\n",sub,count);
			return 1;
			}
	}
	return -1;
}
int main(){
	int num[100],n;
	printf("请输入你要找的数:\n");
	scanf("%d",&n);
	Init_array(num);
	int flag = binary_rearch(num,n);
	if(flag == -1)
	  printf("该数没有找到!\n");
	return 0;
}

3. 分糖果

10个小孩围成一圈分糖果,老师顺次分给每个人的糖数为12 2 8 22 16 4 10 6 14 20.然后按下列规则进行调整,所有小孩同时把自己的糖果分一半给右边的小孩,糖块数变奇数的人,再向老师补要一块,问经过多少次调整后,大家的糖块一样多,且每人多少块

#include<stdio.h>
int Allocation(int a[]){
	int n,b[10] = {0};
	for(int i = 0; i < 10; i++){
		b[i] = a[i]/2;
	}
	for(int j = 0; j < 10; j++){
		if(j == 0){
			a[j] = b[j] + b[9];
		}
		else{
			a[j] = b[j] + b[j-1];
		}
	}

	for(int k = 0; k < 10; k++){
		if(a[k]%2 != 0)
		 a[k]++;
	}
}

int main(){
	int num[10] = {12,2,8,22,16,4,10,6,14,20};
	int count =0;
	//Allocation(num);
	for(int j = 0; j < 10; j++){
		for(int k = 0; k < 10; k++){
			if(num[j] != num[k]){
				Allocation(num);
				count++;
			}
		}
	}
	printf("一共经过了%d次调整,调整后每个小孩有%d个!\n",count,num[0]);
	return 0;
}

4.从键盘中输入一个不超过40个字符的字符的字符串,再输入一个位数,然后输出删除指定字符后的字符串(这个字符的位置也消失,不要有个空格

#include<stdio.h>
int main(){
	char ch,str[40];
	int sub,i = 0,m = 0, n = 0;
	printf("请输入字符串:(回车结束)\n");
	while((ch = getchar()) != '\n'){
		str[n] = ch;
		n++;
	}
	printf("请输入你要删除的位数:\n");
	scanf("%d",&sub);
	while( i < n+1){
		if(i+1 == sub){
			str[i] = str[i+1];
			break;
		}
		i++;
	}
	for(int j = sub; j < n; j++){
		str[j] = str[j+1];
	}
	for(int i = 0; i < n; i++)
	  printf("%c",str[i]);
	printf("\n");
	return 0;
}

5.荷兰军旗

假如有1000个木桶,每一个木桶里装着1个球(球的颜色随机分为 红 白 蓝),现在要求每个桶你只能打开一次,然后进行桶的交换,最后的结果是左边全是红 中间全是白 右边全是蓝

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100

int Init_bowie();
int swap();
int show_array();

int Init_bowie(int *a){
	for(int j = 0; j < N; j++){
		a[j] = rand()%(3)+1;//1表示红色的球,2表示白色的球,3表示蓝色的球;
	}
}
int swap(int *arr){
	int sub,temp;
	for(int i = 0; i < N; i++){
		int j = i-1;
		temp = arr[i];
		while(j >= 0 && temp < arr[j]){
			arr[j+1] = arr[j];
			j--;
		}
		arr[j+1] = temp;
	}
}

int show_array(int *a){
	int count_white = 0, count_blue = 0, count_red = 0;
	int count = 0;
	for(int i = 0; i < N; i++){
		if(a[i] == 1){
			printf("红色 ");
			count_red++;
			count++;
		}
		else if(a[i] == 2){
			printf("白色 ");
			count_white++;
			count++;
		}
		else if(a[i] == 3){
			printf("蓝色 ");
			count_blue++;
			count++;
		}
	
		if(count % 10 == 0){
				printf("\n");
			}
	}

}

//特定的,要生成a~b之间的数字,可以参考rand()%(b-a+1)+a
int main(){
	srand(time(NULL));
	int bowie[N];
	Init_bowie(bowie);
	swap(bowie);
	show_array(bowie);
	return 0;
}

6.输出螺旋矩阵

#include<stdio.h>
#define n 5
int Move();
int Move(int a[][n]){
	int init_num = 0;
	for (int i = 0; i < n/2; i++){
		for(int j = i; j < n-i-1; j++){
			a[i][j] = init_num;
			init_num++;
		}
		for(int k = i; k < n-i-1; k++){
			a[k][n-1-i] = init_num;
			init_num++;
		}

		for(int l = n-1-i; l > i; l--){
			a[n-1-i][l] = init_num;
			init_num++;
		}

		for(int s = n-1-i; s > i; s--){
			a[s][i] = init_num;
			init_num++;
		}
	}
	a[n/2][n/2] = init_num;
}

int main(){
	printf("请输入矩阵的阶数:\n");
	int arr[n][n] = {20};
	Move(arr);
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			printf("%3d  ",arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

7.从键盘输入10个字符串,进行排序,然后按照大小先后顺序打印出来(冒泡排序法)

#include<stdio.h>
#include<string.h>
int main(){
	char t[11],ch[11][11] = {'\0'};
	printf("请输入十个字符串:\n");
	for(int i = 0; i < 10; i++){
		scanf("%s",ch[i]);
	}
	for(int j = 0; j < 10; j++)
	  for(int k = j; k < 10; k++ ){
		  if(strcmp(ch[k],ch[k+1]) == 1){
			  strcpy(t,ch[k+1]);
			  strcpy(ch[k+1],ch[k]);
			  strcpy(ch[k],t);
		  }
	  }

	for(int k = 0; k < 9; k++)
	  printf("%s >  ",ch[k]);
	printf("%s",ch[9]);
	return 0;
}

8.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值