【C语言经典例题】——程序员必须会的经典基础例题(三)

news2025/7/11 10:11:50

关于C语言的一些基础经典题目放在专栏:[C语言刷题]
小菜坤日常上传gitee代码:https://gitee.com/qi-dunyan
❤❤❤
个人简介:双一流非科班的一名小白,期待与各位大佬一起努力!
推荐网站:cplusplus.com
在这里插入图片描述

目录

  • 1、杨辉三角
  • 2、有序序列合并
  • 3、有序序列插入一个数
  • 4、调整奇数偶数顺序
  • 5、修改数字—偶数改为0,奇数改为1
  • 6、猜名次
  • 7、猜凶手
  • 8、字符串逆序单词并打印
  • 9、字符串左旋
  • 10、判断字符串旋转结果

1、杨辉三角

首先我们要知道什么是杨辉三角,如下:
在这里插入图片描述
思路:
我们可以看到,三角的两边都是1,并且从第二行(从0开始算)开始,两边之间的数字,都是上一行的两位数字之和,比如第三行的数字3,等于上一行的1+2,等等。如此,把它看成一个二维数组,便可直接入手

#include<stdio.h>
//     1
//    1 1
//   1 2 1
//  1 3 3 1
// 1 4 6 4 1
int main()
{
	int arr[10][10] = { 0 };
	int i = 0;
	int j = 0;
	int n = 0;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j <= i; j++)
		{
			//第0列都是1
			if (j == 0)
				arr[i][j] = 1;
			//每一行的最后一列也都是1
			if (i == j)
				arr[i][j] = 1;
			//其余的就=上一行的两位数之和
			if (i >= 2 && j < i && j>0)
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
		}
	}
	//打印空格
	for (i = 0; i < n; i++)
	{
		//先打印这一行的空格
		for (j = 0; j < n - i; j++)
		{
			printf(" ");
		}
		//然后打印这一行的数字
		for (j = 0; j <= i; j++)
		{
			printf("%d ", arr[i][j]);
		}
		//换行
		printf("\n");
	}
	return 0;
}

在这里插入图片描述

2、有序序列合并

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围: 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000
输入描述:
输入包含三行第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

方法一:题目没有考虑到时间复杂度,这里最简单粗暴的就是将两次输入的数据放在一个m+n的数组里,然后再进行冒泡排序。如下:

#include <stdio.h>
//有序序列合并
//把两次输入的都放到同一个数组,然后对它进行冒泡排序
int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr[2000];
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    //下标从n开始,一直到n+m-1,一共m个元素
    for (i = n; i < m + n; i++)
    {
        scanf("%d", &arr[i]);
    }

    //冒泡排序//趟数
    for (i = 0; i < n + m; i++)
    {
        for (j = 0; j < n + m - 1 - i; j++)
        {
            //两两相邻元素比较
            if (*(arr + j) > *(arr + j + 1))
            {
                int min = *(arr + j + 1);
                *(arr + j + 1) = *(arr + j);
                *(arr + j) = min;
            }
        }

    }
    //打印
    for (i = 0; i < m + n; i++)
    {
        printf("%d ", *(arr + i));
    }
    return 0;
}

方法二:分别存放在两个数组里,然后进行比较,将数据小的元素输出,然后下标++,但是需要考虑到两种特殊情况,就是一个数组已经输出完了,另一个还没输出完,完整实现代码如下:

#include<stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	int arr1[1000];
	int arr2[1000];
	int i = 0;
	int j = 0;
	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr1[i]);
	}
	for (j = 0; j < m; j++)
	{
		scanf("%d", &arr2[j]);
	}
	i = 0, j = 0;
	while (i < n && j < m)
	{
		//输出小的
		if (arr1[i] < arr2[j])
		{
			printf("%d ", arr1[i]);
			i++;//下标++继续比较
		}
		else if (arr1[i] >= arr2[j])
		{
			printf("%d ", arr2[j]);
			j++;//++继续比较
		}
	}
	//当i==n时,说明arr1已经输出完了,直接把剩下的arr2输出即可
	if (i == n)
	{
		for (; j < m; j++)
		{
			printf("%d ", arr2[j]);
		}
	}
	//j==m时,说明arr2已经输出完了,直接把剩下的arr1输出即可
	else if (j == m)
	{
		for (; i < n; i++)
		{
			printf("%d ", arr1[i]);
		}
	}
	return 0;
}

两种方法都可以实现,方法一思路简单,直接粗暴的解决,方法二的时间复杂度要低于方法一,因此,假如考虑到时间复杂度的情况下,方法二优先。

3、有序序列插入一个数

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

思路:最简单的思路就是与上面相同,将插入的数放在同一个数组,然后直接qsort或者冒泡排序,简单粗暴。这里我采用了qsort(不会的或者已经遗忘的老铁可以去前面的文章复习一下)

#include<stdio.h>
#include<stdlib.h>
//比较
int cmp(const void* e1, const void* e2) {
    return *(int*)e1 - *(int*)e2;
}
//打印
void print(int* arr, int N) {
    int i = 0;
    for (i = 0; i <= N; i++) {
        printf("%d ", arr[i]);
    }
}

int main() 
{
    int arr[50] = { 0 };
    int N = 0;
    int i = 0;

    scanf("%d", &N);
    for (i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &arr[N]);
    //qsort排序
    qsort(arr, N+1, sizeof(arr[0]), cmp);
    print(arr, N);
    return 0;
}

4、调整奇数偶数顺序

题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分
所有偶数位于数组的后半部分

思路:这里题目没有说要保持相对位置不变,所以我们只需要将偶数与奇数分离即可
定义两个指针,一个指向首元素地址,另一个指向末元素地址
在有效范围内,一个从前往后找,找到偶数停止,另一个从后往前,直到找到奇数停止
当两者都停止时交换位置,继续循环
如下图(p1<p2)
在这里插入图片描述
代码实现:

#include<stdio.h>
void swap(int* arr, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		//从前往后,找到偶数停止
		while ((left < right) && (*(arr + left) % 2 == 1))
		{
			left++;
		}
		//从后往前,找到奇数停止
		while ((left < right) && (*(arr + right) % 2 == 0))
		{
			right--;
		}
		//两者交换
		if (left < right)
		{
			int tmp = *(arr + left);
			*(arr + left) = *(arr + right);
			*(arr + right) = tmp;
		}
	}
	//打印
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
}

int main()
{
	int arr[] = { 1,9,80,5,4,68,78,45,2,456,5,1,3,87,9,88,51,20 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	swap(arr, sz);

	return 0;
}

5、修改数字—偶数改为0,奇数改为1

小乐乐喜欢数字,尤其喜欢0和1。他现在得到了一个数,想把每位的数变成0或1。如果某一位是奇数,就把它变成1,如果是偶数,那么就把它变成0。请你回答他最后得到的数是多少。

这里我们通过实际数字进行分析,比如数字123,分析如下:
在这里插入图片描述
代码实现:

#include <stdio.h>
#include<math.h>
int main()
{
    int n=0;
    int tmp=0;
    int sum=0;
    int cont=0;//统计位数
    scanf("%d",&n);
    do
    {
        tmp=n%10;//得到尾数
        if(tmp%2 !=0)
        tmp=(int)1*pow(10,cont);
        else
        tmp=(int)0*pow(10,cont);
        sum+=tmp;//每次相加
        cont++;
    }while(n/=10);
    //打印即可
    printf("%d",sum);
    return 0;
}

6、猜名次

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

思路,把所有可能都列举出来,然后挑选符合题目要求的即可

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	//穷举
	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
							)
						{
						//所有的可能中,只有1,2,3,4,5这五个不同的排名名次,只有这个才符合答案
							if (a * b * c * d * e == 120 && a + b + c + d + e == 15)
							{
								printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);//a=3 b=1 c=5 d=2 e=4
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

在这里插入图片描述

7、猜凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。

与上面的题思路一样,列举所有可能,然后只会存放在一种是符合题意的

#include<stdio.h>
int main()
{
	//凶手
	char killer = '0';
	//ABCD中的一个,列举所有可能
	for (killer = 'A'; killer <= 'D'; killer++)
	{
		//有三个是真的
		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
		{
			printf("%c\n", killer); //C
		}
	}

	return 0;
}

8、字符串逆序单词并打印

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
示例1:
输入
I like beijing.
输出
beijing. like I
不使用库函数strlen等

思路:这里介绍的是三指针两次反转法,比如 I like beijing.
第一次反转(每个单词)I ekil .gnijieb
第二次反转 (整个)beijing. like I
由于这里不让用库函数,所以这里用来计算整个字符串长度的strlrn用不了,但自己可以写一个
代码实现


#include<stdio.h>
#include<assert.h>

//模拟实现strlen
int is_mystrlen(const char*arr)
{
	assert(arr);
	int count = 0;
	while (*(arr++))
	{
		count++;
	}
	return count;
}
//反转
void reserve(char* left, char* right)
{
	assert(left);
	assert(right);

	while (left < right)
	{
		char tmp = *(left);
		*left = *right;
		*right = tmp;

		left++;
		right--;
	}
}

int main()
{
	char arr[101];

	gets(arr);
	//数组名首元素地址
	char* cut = arr;
	//遇到\0结束
	while (*cut)
	{
		char* star = cut;
		char* end = cut;
		while (*end != ' ' && *end !='\0')
		{
			end++;
		}
		//反转
		reserve(star, end - 1);  
		if (*end != '\0')
			cut = end + 1;
		else
			cut = end;
	}
	//计算字符串长度
	int count_ = is_mystrlen(arr);
	//反转整个字符串
	reserve(arr, arr + count_-1 );
	printf("%s", arr);
	return 0;
}

在这里插入图片描述

9、字符串左旋

实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

思路:旋转k次,每次旋转一个字符,k取模,防止不必要的旋转
在这里插入图片描述
代码实现:

#include<stdio.h>
#include<string.h>
void leftRound(char* src, int time)
{
	int i, j, tmp;
	int len = strlen(src);
	time %= len; //长度为5的情况下,旋转6、11、16...次相当于1次,7、12、17...次相当于2次,以此类推。
	for (i = 0; i < time; i++) //执行k次的单次平移
	{
		tmp = src[0];
		for (j = 0; j < len - 1; j++) //单次平移
		{
			src[j] = src[j + 1];
		}
		//再把头赋值到尾
		src[j] = tmp;
	}
}
int main()
{
	int k = 0;
	char arr[1000] = { 0 };
	scanf("%s %d", arr,&k);
	leftRound(arr, k);
	printf("%s", arr);

	return 0;
}

10、判断字符串旋转结果

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

思路:和上个题是一样的,这里把它所有旋转的可能列举出来,然后用strcmp函数进行比较即可。
代码实现:

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

int reverse(char* arr1, char* arr2)
{
	assert(arr1 && arr2);
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	//长度不相等,肯定不是旋转后的
	if (len1 != len2)
		return 0;
	int i = 0;
	int j = 0;
	//把所有可能都旋转
	for (i = 0; i < len1; i++)
	{
		char p = *arr1;
		for (j = 0; j < len1 - 1; j++)
		{
			*(arr1 + j) = *(arr1 + j + 1);
		}
		*(arr1 + len1 - 1) = p;
		//strcmp比较字符串,==0表示相等
		if (strcmp(arr1, arr2) == 0)
		{
			//相等返回1
			return 1;
		}
	}
	//如果经历循环后还没返回,说明不相等,返回0
	return 0;
}
int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "defgabc";
	//两个字符串
	int ret = reverse(arr1, arr2);
	//返回1表示相等,可打印YES看一下
	if (ret == 1)
		printf("YES");
	else
		printf("NO");
	return 0;
}


end
生活原本沉闷。但跑起来就会有风!🌹

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeNet-5学习笔记

LeNet-5 网络结构 输入→卷积&#xff08;C1&#xff09;→池化&#xff08;S2&#xff09;→卷积&#xff08;C3&#xff09;→池化&#xff08;S4&#xff09;→全连接(F5)→全连接&#xff08;F6&#xff09;→输出&#xff08;Output&#xff09; 卷积神经网络的构成 输…

力扣(LeetCode)18. 四数之和(C++)

双指针 快排使 numsnumsnums 正序。 设置四个指针 iii 指向 numsnumsnums 第一个数&#xff0c;jjj 指向 numsnumsnums 第二个数&#xff0c;从前往后枚举 nums[i]nums[i]nums[i] 和 nums[j]nums[j]nums[j] &#xff0c; lll 从 nums[j1]nums[j1]nums[j1] 往后&#xff0c;指…

AI写作文案的技巧:Wordhero AI写作SOP

文案引用自AI Content Hacker Tips 7步成文&#xff1a;2000单词SEO文案写作 | Wordhero AI Editor大更新心态&#xff1a;用AI写作的正确态度 人工智能 (AI) 的兴起导致写作世界发生了一些有趣的变化。许多人现在正在使用人工智能工具来帮助他们写作。一些专家认为&#xff0…

向毕业妥协系列之深度学习笔记(一)浅层神经网络

目录 一.神经网络杂记 二.计算图&#xff08;反向传播求导的几个实例&#xff09; 1.普通式子反向传播求导 2.逻辑回归中的梯度下降 3.m个样本的梯度下降 三.向量化 四.python广播 五.激活函数 六.随机初始化 深度学习系列的文章也可以结合下面的笔记来看&#xff1a;…

java计算机毕业设计装修设计管理系统设计与实现(附源码、数据库)

java计算机毕业设计装修设计管理系统设计与实现&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

【论文阅读】时序动作检测系列论文精读(2020年)

文章目录1. DBG: Fast Learning of Temporal Action Proposal via Dense Boundary Generator论文目的——拟解决问题、贡献——创新实现流程详细方法2. PBR-Net: Progressive Boundary Refinement Network for Temporal Action Detection论文目的——拟解决问题贡献——创新实现…

08.初级指针

一、指针 指针理解的2个要点&#xff1a; 1. 指针是内存中一个最小单元的编号&#xff0c;也就是地址 2. 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff0c;口语中说的指针通常指的是指针变…

VLSI 半定制设计方法 与 全定制设计方法【VLSI】

VLSI 半定制设计方法 与 全定制设计方法【VLSI】VLSI 半定制设计方法1. standard cell 设计方法Standard Cell library设计方法与步骤特点2. 门阵列(gate array)设计方法gate array特点与FPGA的区别PLA3. 门海设计方法(sea-of-gates styles)全定制&#xff1a;无约束设计方法&a…

希望计算机专业同学都知道这些老师

C语言教程——翁凯老师、赫斌 翁恺老师是土生土长的浙大码农&#xff0c;从本科到博士都毕业于浙大计算机系&#xff0c;后来留校教书&#xff0c;一教就是20多年。 翁恺老师的c语言课程非常好&#xff0c;讲解特别有趣&#xff0c;很适合初学者学习。 郝斌老师的思路是以初学…

【UML】活动图Activity Diagram、状态机图State Machine Diagram、顺序图Sequence Diagram

一、活动图 1、简述 活动图和流程图很相似&#xff0c;但是流程图不属于UML图的一种。 类图是一种静态图&#xff0c;属于结构建模&#xff1b;活动图是一个动态图&#xff0c;属于行为建模。 2、元素 2.1 开始、结束、判读、活动、合并 流程图的元素很简单&#xff1a;圆…

[附源码]java毕业设计社区新冠疫情防控网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

WebSocket 和 Socket 的区别

WebSocket 和 Socket 的区别就像Java和JavaScript&#xff0c;并没有什么太大的关系&#xff0c;但又不能说完全没关系。可以这么说&#xff1a; 1.命名方面&#xff0c;Socket是一个深入人心的概念&#xff0c;WebSocket借用了这一概念&#xff1b;2.使用方面&#xff0c;完全…

java项目-第148期ssm社区疫情防控管理信息系统-ssm毕业设计_计算机毕业设计

java项目-第148期ssm社区疫情防控管理信息系统-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm社区疫情防控管理信息系统》 该项目分为2个角色&#xff0c;管理员、用户。 用户可以浏览前台的疫情物资&#xff0c;进行申请领取。申请后可以在后台…

Windows Server 2019 - 辅助DNS

配置辅助DNS实现主DNS的备用 两台虚拟机;都安装了DNS服务器 一个作为主服务器,一个作为备用服务器 主服务器的配置: 固定IP DNS管理器 安装成功后打开DNS管理器 在正向查找区域新建区域

尝试搞懂 MySQL(一)

一、MySQL 基础架构 先上个 MySQL 逻辑架构图 可以看出&#xff0c;整个架构分为两层&#xff1a;server 层 和 存储引擎层。其中&#xff1a; server 层&#xff1a;连接器、查询缓存、分析器、优化器、执行器等&#xff1b;存储引擎层&#xff1a;插件式&#xff0c;支持 In…

与排序相关的STL模板

今天,深度学习了排序的我决定大展身手,将另我突发八十年脑血栓的STL排序全部列举出来. 本博客除了已在文章中说明的函数外,其他默认头文件为<algorithm>. qsort 在c标准库中,此函数被(收藏)于<cstdlib> qsort 与 bsearch 的比较函数 qsort 函数有四个参数&…

华清远见上海中心22071班--11.19作业

题目&#xff1a;实现开发板点灯操作 程序要求&#xff1a; 1&#xff09;分部实现注册字符设备驱动 2&#xff09;自动创建设备节点 3&#xff09;通过结构体对led灯地址进行映射 4&#xff09;次设备号完成私有数据传参 5&#xff09;在open函数中获取到次设备号&#xff0c…

Js逆向教程-10常见代码混淆

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Js逆向教程-10常见代码混淆 一、常见代码混淆 eval混淆AA和OO混淆JSFuck 混淆就是将正常的代码进行语法上的改变或者变量名称上的改变…

基于javaweb,ssm学生宿舍系统(带论文)

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat8.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;非前后端分离 前端技术&#xff1a;vue.jselementUI等框架实现 服务端技术&#xff1a;springspringmvcmybat…

基于stm32单片机的输入捕获测量脉宽Proteus仿真

资料编号&#xff1a;109 下面是相关功能视频演示&#xff1a; 109-基于stm32的输入捕获测量脉宽Proteus仿真(源码仿真全套资料)功能介绍&#xff1a; 采用stm32单片机作为主控&#xff0c;采用单片机的GPIO进行输入捕获&#xff0c;可以测量按键按下的低电平脉宽时间&#x…