前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言沉浸式刷题【C语言必刷题】(经典题型一站式刷完)【长期更新】

C语言沉浸式刷题【C语言必刷题】(经典题型一站式刷完)【长期更新】

作者头像
see.
发布2024-06-04 12:50:03
1050
发布2024-06-04 12:50:03
举报
文章被收录于专栏:C++破军之路

1.模拟实现strlen的功能

程序分析:strlen是库函数中的一种,通过使用该函数,可以求出字符串的长度 (不包括’\0‘), 我们可以把\0作为终止位置的特性利用起来,采用计数器的方法或者递归的方法求出字 符串长度。

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
int my_strlen(char* str)
{
	assert(str != NULL);
	if (*str != '\0')
	{
		return 1 + my_strlen(str+1);
	}
	else
		return 0;
}
int main()
{
	char arr[10] = "abc";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

2. 模拟实现strcpy的功能

程序分析:strcpy是库函数中的一种,它可以把一个字符串的内容复制到另一个字符串中,在msdn 中可以找到其实现方式

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
void get_strcpy(char* des,const char* sou)//此处加const的原因是防止原字符串的内容被修改
{
	assert(sou != NULL);
	while (*des++ = *sou++)
	{
		;	
	}	
}
int main()
{
	char arr1[10] = " xxxxxxx ";
	char arr2[10] = "bit";
	get_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

3.求两个数字的最小公倍数

程序分析:要求出两个数字的最小公倍数,最小公倍数最小也得是两数的最大值,最大不能超过 两数的乘积,我们要以此为条件进行程序设计。

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
int get_min(int a,int b)
{
	int n = a > b ? a : b;
	int min = 0;
	for (n ; n <= a * b; n++)
	{
		
		if (n % a == 0 && n % b == 0)
		{
			min = n;
		}	
	}
	return min;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("%d\n", get_min(a, b));
	return 0;
}

该程序使用了一个名为get_lcm的函数来计算两个数字的最小公倍数。此函数使用了一个while循环来递增最大值并检查是否同时整除两个数字。如果是,函数返回这个最大公倍数。

4.求解0~10000的水仙花数

水仙花数的定义

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

程序分析:1.首先我们应该生成0~10000的数字,判断它是几位数

2.例如数字为123,我们要设想如何把它的各个位上的数字拿下来,这里我们采用%、 /的方法之后我们再对它的每一位进行平方运算,最后把各个位上平方后的数字求和

3.判断求和之后的数字与原数字是否相同,相同则打印在屏幕上

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
#include<math.h>
int main()
{
	int i = 0;	
	for (i = 0; i < 10000; i++)
	{
		//判断是几位数
		int count = 1;
		int tmp = i;
		while (tmp / 10)
		{
			count++;
			tmp  /=  10;
		}
		//对每一项求次方并相加
		tmp = i;
		int sum = 0;
		while (tmp)
		{
			sum += pow(tmp % 10, count);//此处的pow函数(求次方)为库函数,引用头文件math.h
			tmp /= 10;
		}
		//判断
		if (sum == i)
		{
			printf("%d ", i);
		}

	}
	return 0;
}

5.求和计算:Sn=a+aa+aaa+aaaa+……

程序分析:拿到题目,我们应该想如何生成a和aa这种特殊类型的数字,我们发现a*10+a=aa;依 照这个思路我们可以利用循环的思路生成多个数字,最终进行求和即可

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
int  main()
{
	int a = 0;
	int n = 0;
	scanf("%d %d", &a, &n);
	int j = 0;
	int subsequent = 0;
	int sum = 0;
	for (j = 1; j <= n; j++)
	{
		subsequent = subsequent * 10 + a;
 		sum += subsequent;
	}
	printf("sum = %d\n", sum);
	return 0;
}

6.设计函数实现字符串逆序

程序分析:拿到题目我们首先想如何实现字符串逆序,我们想到,只要让开始和末尾的字符进行 交换,第二个和倒数第二个进行交换,以此类推,整个字符串就被我们逆序完了。有 这个设计思路,我们采用循环结构,当left=right或left>right时,循环终止,所以循环条 件设为left<right

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
//字符串的逆序
void reverse_string(char str[])
{
	int left = 0;
	int right = strlen(str) - 1;
	while (left < right)
	{
		char tmp = str[left];
		str[left] = str[right];
		str[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

7.打印菱形

程序分析:我们首先画一个普通的菱形进行分析。拆分菱形为上下两部分,上半部分行数为line,下半部分行数则为line-1,根据空格和*的个数进行分析和打印

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int line = 0;
	scanf("%d", &line);
	int i = 0;
	//上
	for (i = 0; i <line ; i++)
	{
		//打印每行
		//打印空格
		int j = 0;
		for (j = 0; j < line - 1 - i; j++)
		{
			printf(" ");
		}		
		//打印*
		for (j = 0; j < 2 * i + 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for (i = 0; i < line - 1; i++)
	{
		//打印每行
		//打印空格
		int j = 0;
		for (j = 0; j <= i; j++)
		{
			printf(" ");
		}
		//打印*
		for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

8.喝汽水问题,一瓶汽水1元,两个空瓶可以换一瓶汽水,给money元,能喝多少瓶汽水

程序分析:喝的汽水的总数为花钱买的+置换的,每两个空瓶就可以换一瓶,所以循环条件是 empey(空瓶数量)>=2,在进行换瓶子这个动作时,奇数个瓶子也要保留因此要加上 empey%2

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int money = 0;
	scanf("%d", &money);
	int empty = money;
	int total = money;
	while (empty >= 2)
	{
		total += empty/2;
		empty = empty / 2 + empty % 2;//empty%2的原因是手中有奇数个瓶子时也可以保留
	}
	printf("%d\n", total);
	return 0;
}

9.移动数组内元素,使得奇数在前,偶数在后

程序分析:首先应该想如何分辨奇数和偶数,我们想到取模运算i%2==0时,i为偶数,反之则为奇 数,通过定义left和right快捷访问数组的起始部分和末尾,通过循环的方式逐层向内推 进,实现整个数组前面的奇数和后面的偶数进行交换,最终达到题目要求的效果。

程序源代码:

代码语言:javascript
复制
void move(int str[],int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		//从左边找到一个偶数
		while ( (left<right)  &&  ((str[left] % 2) == 1) )
		{
			left++;
		}
		//从右边找到一个奇数
		while ( (left < right) &&  ((str[right] % 2) == 0))
		{
			right--;
		}
		if (left < right)
		{
			int tmp = str[left];
			str[left] = str[right];
			str[right] = tmp;
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	move(arr,sz);	
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

10.递归实现n的k次方

程序分析:n的k次方就是n个k相乘,根据’大事化小‘的思路看,也就是n*(n-1)^k

程序源代码:

代码语言:javascript
复制
#include<stdio.h>
int power(int n, int k)
{
	if (k == 0)
		return 1;
	else
		return n * power(a , k-1);
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n,&k);	
	printf("%d", power(n, k));
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 5.求和计算:Sn=a+aa+aaa+aaaa+……
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档