C语言沉浸式刷题【C语言必刷题】

1.猜凶手

某地发生了一起谋杀案,警察通过排查确定杀人凶手必为四个嫌疑犯的一个,以下是4个嫌犯的供词。已知(请编写代码找出凶手)

A说:不是我。

B说:是C。
C说:是D。
D说:C再胡说。

程序分析:这是一道实际问题,其实本身并不复杂,只需要分别假定A、B、C、D四人分别是凶                      手,假定谁是凶手时满足题意,就能确定凶手。写成代码形式可以把这些条件相加(                      条件为真为1,假则为0),当结果等于3时,就可以得到正确答案。

程序源代码:

#include<stdio.h>
int main()
{
	char killer = 0;
	for (killer = 'A'; killer <= 'D'; killer++)
	{
		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
		{
			printf("凶手是:%c\n", killer);
		}
	}
	return 0;
}

2.猜名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说: 我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次

 程序分析:通过前面一题的经验,我们可以采用条件相加等于一个特定值来进行判断满足条件的名次,这里,我们通过穷举法进行分析。

程序源代码:

#include <stdio.h>
int main() {
    int a, b, c, d, e;
    for (a = 1; a <= 5; a++) 
    {
        for (b = 1; b <= 5; b++) 
        {
            for (c = 1; c <= 5; c++)
            {
                for (d = 1; d <= 5; d++) 
                {
                    for (e = 1; e <= 5; e++)
                    {                        
                            if (((b == 2) + (a == 3) == 1) &&
                                ((b == 2) + (e == 4) == 1) &&
                                ((c == 1) + (d == 2) == 1) &&
                                ((c == 5) + (d == 3) == 1) &&
                                ((e == 4) + (a == 1) == 1)) 
                            {
                                if(a * b * c * d * e == 120 )
                                printf("A:%d, B:%d,C:%d, D:%d, E:%d\n", a, b, c, d, e);
                            }                      
                    }
                }
            }
        }
    }
    return 0;
}

3.杨氏矩阵

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。 

要求:时间复杂度小于O(N)

程序分析:对于在一个题目中这种数组中查找某个数字,我们可以采取遍历整个数组的方法找到该数字,但是时间复杂度上就不满足,因此我们要选择一种更优的查找算法。在本代码中,我们选取右上角的数字为标准,因为数组不论是从上到下还是从左到右都是递增的。如果要查找的数字大于右上角的数字,则第一排的数字不可能存在我们要找的数字,因此可以直接划去第一排;如果要查找的数字小于右上角的数字,则该列的数字不可能存在我们要找的数字,因此可以直接划去该列。

int find_num(int arr[3][3], int* row, int* col, int k)
{
	int x = 0;
	int y = *col - 1;
	while (x < *row && y>=0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			*row = x;
			*col = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//查找数字7
	int k = 7;
	int x = 3;
	int y = 3;
	int ret = find_num(arr, &x, &y, k);
	if (ret == 1)
	{
		printf("找到了,在arr[%d][%d]",x ,y );
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

4.旋转字符串

左旋字符串,实例:A B C D E F,逆序一次后变成B C D E F A

程序分析:

要左旋一次字符串,就是要把最左边的字符放在最右边,然后后边的字符串都往前挪动一个长度。因此我们想到用指针的方式来进行作答,先把最左边的字符存储起来,后面的字符利用循环的方式依次前移,最后把存储起来的字符放在最后即可

程序源代码:

#include<stdio.h>
#include<string.h>
void left_rotate(char* str, int k)
{
	int i = 0;
	int len = (int)strlen(str);
	for (i = 0; i < k; i++)
	{
		//把左侧数字存储起来
		char tmp = *str;
		int j = 0;
		for (j = 0; j < len - 1; j++)
		{
			//把n-1个字符前移
			*(str + j) = *(str + j + 1);
		}
		//把tmp的值放在最后
		*(str + len - 1) = tmp;
	}
}
int main()
{
	char str[10] = "ABCDEF";
	int k = 2;
	left_rotate(str, k);
	printf("%s", str);
	return 0;
}

我们也可以使用三步翻转法来解决该问题,大家可以参考一下下面的代码:

#include<stdio.h>
void reverse_string(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void left_rotate(char* str, int k)
{
	int len = strlen(str);
	reverse_string(str, str + k - 1);//左
	reverse_string(str + k, str + len - 1);//右
	reverse_string(str, str + len - 1);//整体
}
int main()
{
	char str[10] = "ABCDEF";
	int k = 4;
	left_rotate(str, k);
	printf("%s\n", str);
	return 0;
}

5.逆序字符串

将一句话的单词进行倒置,标点不倒置,比如I like beijing.经过函数后变为:beijing. like I

程序分析:在这里介绍一种经典的翻转字符串的方法:三步翻转法。首先我们把整个字符串进行翻转,就以I like beijing.为例,翻转后变成.gnijieb ekil I,然后紧接着再把各个单词进行翻转,就变成beijing. like I正好满足题意。

程序源代码:

//三步翻转法
#include<stdio.h>
#include<stdlib.h>
void reverse_string(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[100] = { 0 };
	gets(arr);
	int len =(int) strlen(arr);
	//字符串整体反转
	reverse_string(arr, arr + len - 1);
	//单个单词反转
	char* start = arr;
	while (*start)
	{
		char* end = start;
		while (*end != ' ' &&  *end!= '\0')
		{
			end++;
		}
	    reverse_string(start, end - 1);
		if (*end == ' ')
			start = end + 1;
		else
			start = end;
	}
	printf("%s", arr);
	return 0;
}

6.公务员面试

公务员面试现场打分,有7位考官,从键盘上输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。输入描述:一行,输入7个参数(0~100),代表7个成绩,用空格分隔。 

程序分析:其实大体的思路比较清晰,就是利用scanf依次读取7个数据,找出七个数据中的最大值和最小值,打印输出除去最大最小值后,其他数据的平均值。下面是最普通的代码实例。

程序源代码:

#include<stdio.h>
int cmp(const void* a,const void* b)
{
	return (*(int*)a - *(int*)b);//升序
}
int main()
{
	int sum = 0;
	int score[7] = { 0 };
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		scanf("%d", &score[i]);
		sum += score[i];
	}
	qsort(score, 7, sizeof(int), cmp);
	int min = score[0];
	int max = score[6];
	printf("%.2f", (sum - min - max) / 5.0);
	return 0;
}

其实上面的实现方法比较复杂,使用了快速排序函数qsort先排序后找出最大最小值,其实我们可以在读取数据时就顺便把最大最小值找出,这样极大简化了程序的复杂程度。请看下面源代码:

#include<stdio.h>
int main()
{
	int score = 0;
	int sum = 0;
	int max = 0;
	int min = 100;//我们把min的初始值置成100,以确保最小值能够正常更新
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		scanf("%d", &score);
		sum += score;
		if (score > max)
		{
			max = score;
		}
		if (score < min)
		{
			min = score;
		}
	}
	printf("%.2f", (sum - min - max) / 5.0);
	return 0;
}

7.获得月份的天数

 KIKI想获得某年某月有多少天,请帮助他编程实现,输入年份和月份,计算这一年这个月有多少天。输入描述:多组输入,一行有两个整数,分别表示年份和月份,用空格分隔

程序分析:首先,看见多组输入,我们设计成while循环,以end of file作为结束条件,实现多组输入。然后,我们要考虑特殊情况,平年的二月是28天,闰年的二月是29天,所以我们要判断一下平年还是闰年。因为每年都是十二个月,除二月有特殊情况外其他的每年都一样,我们决定采用数组下标访问的方式来进行。

#include<stdio.h>
#define EOF (-1)
int main()
{
	int year = 0;
	int month = 0;
	int days[13] = { 0,31,28,31,30,31,30,31,31,30,30,31 };
	while (scanf("%d %d", &year, &month) != EOF)
	{
		int day = days[month];
		if (year == 2)
		{
            //判断是否是闰年
			if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
			{
				day += 1;
			}
		}
		printf("%d\n", day);
	}
	return 0;
}

8、有序序列插入一个数,使其仍为一个有序数组

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序输入描述:第一行输入一个整数(0<=N<=50)。第二行输入N个升序排列的整数,输入用空格分隔的N个整数第三行输入想要进行插入的一个整数。

程序分析:我们看见题目最先想到的是把数字直接插入进去,进行冒泡排序即可再次得到一个有序数组,但是冒泡排序使用了两次for循环,时间复杂度为o(n^2),比较复杂。

通过列举一个简单的示例,我们发现要把一个数字插入,只要后面的数字依次往后后退一个位置,再把这个数字插入进去,问题就得到了解决。

程序源代码:

#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[51] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int m = 0;//要插入的数字
	scanf("%d", &m);
	for (i = n - 1; i>=0 ; i--)
	{
		if (m < arr[i])
		{
			arr[i + 1] = arr[i];
		}
		else
		{
			arr[i+1] = m;
			break;
		}
	}
	if (i < 0)
	{
		arr[0] = m;
	}
	for(i = 0; i < n + 1; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

9.找出缺失的数字(多种方法实现)

数组num包含从0到n的所有整数,但其中缺了一个,请编写代码找出那个缺失的整数,你有办法在O(n)内完成吗,编写C语言代码解决,使用按位异或的知识

程序分析:法一、看见题目,我们首先想到可以用遍历数组的方式来找出缺失的值,先使用qsort函数进行排序,如果碰到一个数字的值不等于下一个数字的值-1,那么我们就找到了缺失的数字。法二、采用相减的方法可快速求出结果(0+1+2+3+...+n)-(a[0]+a[1]+[2]+...+a[n-1])。法三、qsot排序,数组中值是几就在第几个位置上写下这个值。法四、采用按位异或的方法:a^a=0,a^0=a.这里具体只实现第四种方法。

程序源代码:

#include<stdio.h>
int find_missing(int arr[], int sz)
{
	int missing = 0;
	int i = 0;
	//对0~n的数字进行抑或
	for (i = 0; i <= sz; i++)
	{
		missing ^= i;
	}
	//与数组中的数字进行抑或
	for (i = 0; i < sz; i++)
	{
		missing ^= arr[i];
	}
	return missing;
}
int main()
{
	int arr[] = { 0,1,2,3,5,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d\n",find_missing(arr,sz));
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/268390.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCIe surprise down异常与DPC功能分析-part2

DPC是PCIe协议中的一项功能&#xff0c;旨在防止由于一个设备的错误而影响到整个系统。当一个PCIe设备检测到严重的、不可恢复的错误时&#xff0c;它可能会触发DPC过程。在这个过程中&#xff0c;PCIe开关会隔离受影响的下游端口&#xff0c;阻止任何进一步的数据传输和请求通…

百分百能遇到的接口自动化测试面试题,看完的现在已经在办理入职了...

1. 什么是接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试是指使用自动化工具对接口进行测试&#xff0c;验证接口的正确性、稳定性和性能等方面的指标。 2. 为什么要进行接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试可以提高测试效率&#xff0c;减…

NGUI基础-三大基础组件之Root组件

NGUI NGUI&#xff08;Next-Gen UI&#xff09;是一款用于Unity游戏引擎的UI插件&#xff0c;它提供了一套功能强大、灵活易用的界面开发工具。在NGUI中&#xff0c;Root&#xff08;根节点&#xff09;是一个重要的概念。 基础组件之Root Root是NGUI中的最高层级节点&#…

生物神经网络衍生出的算法

一个生物神经网络的基本结构&#xff1a; 生物神经网络由大量神经元组成&#xff0c;这些神经元之间通过突触相互连接。神经元可以接收来自其他神经元的信号&#xff0c;并根据信号的强度和类型来调整自己的输出信号。这种神经元之间的相互连接和信号传递形成了生物神经网络的基…

【汽车取证篇】GA-T 1998-2022《汽车车载电子数据提取技术规范》(附下载)

【汽车取证篇】GA-T 1998-2022《汽车车载电子数据提取技术规范》&#xff08;附下载&#xff09; GA-T 1998-2022《汽车车载电子数据提取技术规范》标准—【蘇小沐】 总结 公众号回复关键词【汽车取证】自动获取资源合集&#xff0c;如链接失效请留言&#xff0c;便于…

博主自制丨免费下载丨免费使用丨仅用于测试

链接&#xff1a;点我立即下载 提取码&#xff1a;0j6h

贴片晶振无源石英谐振器直插晶振

贴片晶振 贴片晶振3.579M~25MHz无源石英谐振器直插晶振 文章目录 贴片晶振前言一、贴片晶振3.579M~25MHz无源石英谐振器直插晶振二、属性三、技术参数总结前言 贴片晶振(Surface Mount Crystal Oscillator)是一种采用表面贴装技术进行安装的晶振。它的主要特点是封装小巧、安…

什么是DDOS,遇到DDoS攻击有什么办法处理

一、DDoS概述 DDoS攻击是由DoS攻击发展而来的&#xff0c;根据攻击原理和方式的区别&#xff0c;可以把DDoS攻击分为两个阶段&#xff0c;即从传统的基于网络层的DDoS攻击和现阶段较为常见的基于应用层的DDoS攻击&#xff0c;这两类攻击方式各有特点&#xff0c;都对网络的安全…

为什么要使用vite

vue ——&#xff09;webpack 全部读取完毕才显示&#xff1a; vite:只读取修改的部分&#xff0c;速度比较快

P6 音频格式—— AAC

目录 前言 01 AAC是什么&#xff1f; 02 为什么需要进行AAC进行音频压缩处理&#xff1f; 03 AAC的特点以及优势 04 AAC格式详解&#xff1a; 4.1. ADIF的数据结构&#xff1a; 4.1.1 ADIF Header具体的表格: 4.2. ADTS的结构&#xff08;重点&#xff09;&#xff1a; …

esp32使用lvgl,给图片取模显示图片

使用LVGL官方工具。 https://lvgl.io/tools/imageconverter 上传图片&#xff0c;如果想要透明效果&#xff0c;那么选择 输出格式C array&#xff0c;点击Convert进行转换。 下载.c文件放置到工程下使用即可。

Autojs 实践-抖音极速版福袋助手

前言 好久没更新博客了&#xff0c;最近做了个抖音极速版福袋脚本&#xff0c;想看看能不能自动抢到&#xff0c;于是在仿照其他脚本UI做了一个&#xff0c;哈哈。利用上班时间让它自己跑&#xff0c;测试大概2-3天&#xff0c;一个福袋没抢到(也不知道是不是被检测到了)&…

jQuery实现响应式瀑布流 - 实现灯箱效果

在这之前&#xff0c;有写过一篇关于实现瀑布流的文章&#xff0c;后期有人留言提出需要添加灯箱效果的功能&#xff0c;所以这次则讲述下如何实现此功能。由于该篇接上篇写的&#xff1a;jQuery实现响应式瀑布流效果&#xff08;jQueryflex&#xff09;_jquery瀑布流插件-CSDN…

python的import功能,你需要了解的导入机制

1 基本概念 概念 解释 import 即导入&#xff0c;方式就是在import位置将代码文件拷贝过去。 模块&#xff08;module&#xff09; python中一个.py文件定义为一个模块 常用的几种模块导入方式&#xff1a; import module_nameimport module_name.function_nameimport mod…

听GPT 讲Rust源代码--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代码中&#xff0c;suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下&#xff0c;用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Web Components入门不完全指北

目前流行的各类前端框架&#xff0c;不管是react, angular还是vue&#xff0c;都有一个共同点&#xff0c;那就是支持组件化开发&#xff0c;但事实上随着浏览器的发展&#xff0c;现在浏览器也原生支持组件式开发&#xff0c;本文将通过介绍Web Components 的三个主要概念&…

分析冒泡排序

#include <stdio.h> int main() { int arr[10] { 2,5,1,3,6,4,7,8,9,0 }; int i 0; int j 0; for( i 0 ;i < sizeof(arr)/sizeof(arr[0]) - 1 ; i) 红色的代表数组一共有n个元素&#xff0c;则需要n-1次 { for( j 0 // 这里可以让数组从哪一…

设计模式--职责链模式

实验15&#xff1a;职责链模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解职责链模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用职责链模式解决实际问题。 [实验任务]&#xff1a;财务审批 某物资管理系统…

canvas入门笔记(上)

Canvas Canvas简介 Canvas API 提供了一个通过JavaScript 和 HTML的元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 Canvas API 主要聚焦于 2D 图形。而同样使用<canvas>元素的 WebGL API 则用于绘制硬件加速的 2D 和…

抠图、换背景、正装图证件照制作方法

本篇灵感是最近又要使用别的底色的正装照的图片。上学的时候&#xff0c;要求证件照的底色是蓝底、党员档案里要求图片的底色是红底、 将来上班的证件照要求是白底&#xff0c;并且无论是考研还是找工作都是制作简历的时候&#xff0c;根据简历的样板不同需要更换不同的底色。 …