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

目录

1.模拟实现strlen的功能

2. 模拟实现strcpy的功能

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

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

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

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

7.打印菱形

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

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

10.递归实现n的k次方


1.模拟实现strlen的功能

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

程序源代码:

#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                    中可以找到其实现方式 

 程序源代码:

#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.求两个数字的最小公倍数

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

程序源代码:

#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.判断求和之后的数字与原数字是否相同,相同则打印在屏幕上

程序源代码:

#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;依                    照这个思路我们可以利用循环的思路生成多个数字,最终进行求和即可

程序源代码:

#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

程序源代码:

#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,根据空格和*的个数进行分析和打印

程序源代码:

#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

程序源代码:

#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快捷访问数组的起始部分和末尾,通过循环的方式逐层向内推                      进,实现整个数组前面的奇数和后面的偶数进行交换,最终达到题目要求的效果。 

程序源代码:

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

程序源代码:

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

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言作为一门广泛应用的编程语言,学习它对于新手来说是很有要的。为了更好地掌握C语言的基本概念和编程技巧,新手可以尝试编程50题。以下是一些理由: 首先,编程题可以帮助新手熟悉C语言的语法规则和常用函数。通过解决各种不同类型的编程问题,新手可以加深对C语言的理解,并培养编程思维和逻辑思维能力。 其次,编程题可以帮助新手锻炼编程的实践能力。学习编程语言不仅仅是理论的学习,更需要通过实践来提高。通过解决编程题目,新手可以学习如何将问题分解为更小的子问题,如何设计实现算法数据结构,并加深对编程的实践经验。 此外,编程题还有助于新手了解常见的编程模和技巧。在解决编程问题的过程中,新手可以接触到各种常见的编程模,如循环、条件判断、递归等,并学习如何运用这些模来解决实际问题。 最后,编程题可以提高新手的自信心。通过解决一系列编程问题,新手可以逐渐掌握C语言的基本知识和编程技巧,从而在编程能力上取得明显的进步。这种进步不仅可以帮助新手更好地成后续的学习和项目,还可以增强新手在编程方面的自信心。 总而言之,编程50题对C语言新手来说是非常有益的。通过解决一系列编程问题,新手可以加深对C语言的理解,锻炼编程实践能力,掌握常见的编程模和技巧,并提升自信心。因此,我强烈推荐C语言新手编程50题来加深对C语言的掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值