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