C语言初阶必刷题-经典题精选

文章目录

  • 函数判断素数
  • 函数判断闰年
  • 打印一个数的每一位
  • 求阶乘
      • 非递归实现
      • 递归实现
  • strlen的模拟
      • 非递归实现
      • 递归实现
  • 字符串逆序
      • 非递归实现
      • 递归实现
        • 方法二
  • 计算一个数的每位之和(递归实现)
  • 递归实现n的k次方
  • 递归和非递归分别实现求第n个斐波那契数
        • 递归实现
        • 非递归实现

函数判断素数

题目内容:
实现一个函数,判断一个数是不是素数。
利用上面实现的函数打印100到200之间的素数。

#include 
#include 
int is_prime(int x)
{
	int j = 2;
	for (j = 2;j < sqrt(x);j++)
	{
		if (x % j ==0)
			return 0;
	}
	return 1;
}

int main()
{
	int i = 0;
	for (i = 100;i <= 200;i++)
	{
		if (is_prime(i))
			printf("%d ", i);
	}
	return 0;
}

函数判断闰年

题目内容:
实现函数判断year是不是润年。

判断闰年:
第一种情况:能被4整除但不能被100整除的是闰年
第二种情况:能够被400整除的是闰年
这两种结合起来就能全面判断是不是闰年

#include 
int is_leap_year(int x)
{
	if ((x % 4 == 0 && x % 100 != 0) || (x % 400 == 0))
		return 1;
	return 0;
}

int main()
{
	int year = 0;
	printf("请输入:");
	scanf("%d", &year);
	if (is_leap_year(year))
		printf("%d年是闰年", year);
	else
		printf("%d年不是闰年", year);
	return 0;
}

打印一个数的每一位

递归方式实现打印一个整数的每一位

如:
输入1234
打印:1 2 3 4

#include 
void print(unsigned int x)
{
	if (x > 9)
	{
		print(x / 10); 
	}
	printf("%d ", x % 10);
}

int main()
{
	unsigned int a = 0;
	scanf("%u", &a);  
	print(a);        //接收一个无符号整数,按照顺序打印它的每一位
	return 0;
}

求阶乘

递归和非递归分别实现求n的阶乘(不考虑溢出的问题)

非递归实现

#include 
int ert(int x)
{
	int i = 0;
	int ret = 1;
	for (i = 1;i <= x;i++)
	{
		ret *= i;
	}
	return ret;
}

int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d", ert(a));
	return 0;
}

递归实现

#include 
int ert(x)
{
	if (x <= 1)
		return 1;
	else
		return x * ert(x - 1);
}

int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d",ert(a));
	return 0;
}

strlen的模拟

递归和非递归分别实现strlen

非递归实现

#include 
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;     //找下个字符
	}
	return count;
}

int main()
{
	char arr[100];
	scanf("%s", &arr);
	int len = my_strlen(arr);
	printf("%d", len);
}

递归实现

int my_strlen(char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

int main()
{
	char arr[100];
	scanf("%s", &arr);
	int len = my_strlen(arr);
	printf("%d", len);
}

字符串逆序

编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba

非递归实现

#include 
int main()
{
	char arr[] = "abcdefg";    //[a b c d e f g \0]
		int sz = sizeof(arr) / sizeof(arr[0]);
		int left = 0;
		int right = sz - 2;     
		//int right=strlen(arr)
		while (left < right)
		{
			char tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
			left++;
			right--;
		}
		printf("%s\n", arr);
	return 0;
}

递归实现

void reverse(char* str)
{
	char tmp = *str;
	int len = strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if(strlen(str+1)>=2)
	 reverse(str + 1);
	*(str + len - 1) = tmp;
}

int main()
{
	char arr[] = "abcdefg";
	reverse(arr);
	printf("%s\n",arr);
	return 0;
}

方法二

void reverse(char arr[], int left, int right)
{
	char tmp = arr[left];
	arr[left] = arr[right];
	arr[right] = tmp;
	if (left < right)
		reverse(arr, left + 1, right - 1);
}

int main()
{
	char arr[] = "abcdefg";
	int left = 0;
	int right = strlen(arr) - 1;
	reverse(arr,left,right);
	printf("%s\n",arr);
	return 0;
}

计算一个数的每位之和(递归实现)

写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19

#include 
int DigitSum(unsigned int n)
{
	if (n > 9)
		return DigitSum(n / 10) + n % 10;
	else
		return n;
}
int main()
{
	unsigned int n = 0;
	scanf("%u", &n);
	int sum = DigitSum(n);
	printf("%d\n",sum);
	return 0;
}

递归实现n的k次方

编写一个函数实现n的k次方,使用递归实现。

#include 
double Pow(int n, int k)
{
	if (k > 0)
		return n * Pow(n, k - 1);
	else if (k == 0)
		return 1;
	else
		return 1.0 / Pow(n, -k);
}

int main()
{
	int n = 0;
	int k = 0;
	scanf("%d%d", &n, &k);
	double ret = Pow(n, k);
	printf("%lf\n", ret);
	return 0;
}

递归和非递归分别实现求第n个斐波那契数

例如:
输入:5 输出:5
输入:10, 输出:55
输入:2, 输出:1

递归实现

#include 
int Fun(int x)
{
	if (x <= 2)
		return 1;
	else
		return Fun(x - 1) + Fun(x - 2);
}

int main()
{
	int a = 0;
	scanf("%d", &a);
	int ret = Fun(a);
	printf("%d", ret);
	return 0;
}

非递归实现

int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d", ret);
	return 0;
}

你可能感兴趣的:(初识C语言每日一练,c语言,算法,c++)