C语言必做30道练习题

C语言练习30题(分支循环,数组,函数,递归,操作符)

目录

分支循环

1.闰年的判断

闰年判断的规则:

  1. 能被4整除并且不能被100整除是闰年
  2. 能被400整除是闰年
c 复制代码
#include <stdio.h>
//代码1
int main()
{
	int year = 0;
	scanf("%d", &year);
	if(year%4==0 && year%100!=0)
	printf("是闰年\n");
	else if(year%400==0)
	printf("是闰年\n");
	else
	printf("不是闰年\n");
	return 0;
}
//代码2
int main()
{
	int year = 0;
	scanf("%d", &year);
	if((year%4==0 && year%100!=0) || (year%400==0))
	printf("是闰年\n");
	return 0;
}

2.阅读代码,计算代码输出的结果

c 复制代码
#include <stdio.h>
int main()
{
	int i = 0,a=0,b=2,c =3,d=4;
	i = a++ && ++b && d++;
	//i = a++||++b||d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
	return 0;
}

运行结果

i=a++ || ++b || d++

运行结果

3.输入一个1~7的数字,打印对应的星期几

例如:

输⼊:1 输出:星期⼀

输⼊:2 输出:星期⼆

输⼊:3 输出:星期三

输⼊:4 输出:星期四

输⼊:5 输出:星期五

输⼊:6 输出:星期六

输⼊:7 输出:星期天

c 复制代码
#include <stdio.h>
int main()
{
	int day = 0;
	printf("请输入星期几\n");
	scanf("%d",&day);
	switch (day)
	{
		case 1:
			printf("星期一\n");
			break;
		case 2:
			printf("星期二\n");
			break;
		case 3:
			printf("星期三\n");
			break;
		case 4:
			printf("星期四\n");
			break;
		case 5:
			printf("星期五\n");
			break;
		case 6:
			printf("星期六\n");
			break;
		case 7:
			printf("星期天\n");
			break;
	}
	return 0;
}

4.输入任意一个整数值,计算除3之后的余数

c 复制代码
#include <stdio.h>
int main()
{
	int n = 0;
	printf("请输入n的值\n");
	scanf("%d", &n);
	if (n % 3 == 0)
		printf("整除,余数为0\n");
	else if (n % 3 == 1)
		printf("余数是1\n");
	else
		printf("余数是2\n");
	return 0;
}

5.输入一个人的年龄

如果年龄<18岁,打印"少年"

如果年龄在18岁⾄44岁打印"⻘年"

如果年龄在45岁⾄59岁打印"中老年"

如果年龄在60岁⾄89岁打印"老年"

如果90岁及以上打印"老寿星"

c 复制代码
#include <stdio.h>
int main()
{
	int age = 0;
	printf("请输入年龄\n");
	scanf("%d", &age);
	if (age < 18)
		printf("少年\n");
	else if (age <= 44)
		printf("青年\n");
	else if (age <= 59)
		printf("中老年\n");
	else if (age <= 89)
		printf("老年\n");
	else
		printf("老寿星\n");
	return 0;
}

6.输入一个年龄,>= 18岁就输出:成年,否则就输出:未成年

c 复制代码
#include <stdio.h>
int main()
{
	int age = 0;
	printf("请输入年龄\n");
	scanf("%d", &age);
	if (age >= 18)
		printf("成年\n");
	else
		printf("未成年\n");
	return 0;
}

7.输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。

c 复制代码
#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入数值\n");
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d 是奇数\n", num);
	else
		printf("%d 是偶数\n", num);
	return 0;
}

8.计算1~100之间3的倍数的数字之和

c 复制代码
#include <stdio.h>
int main()
{
	int i = 0;
	int sum = 0;
	for(i=1; i<=100; i++)
	{
		if(i % 3 == 0)
		sum += i;
	}
	printf("%d\n", sum);
	return 0;
}
//⼩⼩的优化
//如果能直接产⽣3的倍数的数字就省去了多余的循环和判断
#include <stdio.h>
int main()
{
	int i = 0;
	int sum = 0;
	for(i=3; i<=100; i+=3)
	{
		sum += i;
	}
	printf("%d\n", sum);
	return 0;
}

9.输入一个正整数,逆序打印这个整数的每一位

例如:

输⼊:1234,输出:4 3 2 1

输⼊:521,输出:1 2 5

c 复制代码
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	while(n)
	{
		printf("%d ", n%10);
		n /= 10;
	}
	return 0;
}

10.输入一个正整数,计算这个整数是几位数?

例如:

输⼊:1234 输出:4

输⼊:12 输出:2

c 复制代码
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int cnt = 0;
	do
	{
		cnt++;
		n = n / 10;
	} while (n);
	printf("%d\n", cnt);
	return 0;
}

11.找出100~200之间的素数,并打印在屏幕上。

注:素数又称质数,只能被1和本身整除的数字。

c 复制代码
#include <stdio.h>
int main()
{
	int i = 0;
	//循环产⽣100~200的数字
	for(i=100; i<=200; i++)
	{
		//判断i是否为素数
		//循环产⽣2~i-1之间的数字
		int j = 0;
		int flag = 1;//假设i是素数
		for(j=2; j<i; j++)
		{
			if(i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if(flag == 1)
		printf("%d ", i);
	}
	return 0;
}

数组

12. 多个字符从两端移动,向中间汇聚

编写代码,演示多个字符从两端移动,向中间汇聚

c 复制代码
#include<stdio.h>
#include<stdlib.h>

int main()
{
	char arr1[] = "hello wrold" ;
	char arr2[] = "***********" ;
	int left = 0;
	int right = strlen(arr1) - 1;
	int i = 0;
	while (left < right)
	{
		Sleep(1000);//休眠1000毫秒
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n",arr2);
		left++;
		right--;
	}
	return 0;
}

13. 二分查找

在⼀个升序的数组 中查找指定的数字n,很容易想到的方法就是遍历数组

但是这种方法效率比较低。

比如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。

你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?

你会1,2,3,4...这样猜吗?显然很慢;一般你都会猜中间数字,比如:150,

然后看大了还是小了,这就是二分查找 ,也叫折半查找

求中间元素的下标 ,使用mid = (left+right)/2 ,

如果left和right比较大的时候可能存在问题,可以使用下面的代码:

c 复制代码
mid = left+(right-left)/2;
c 复制代码
#include<stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//升序的数组
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int key = 3;//要找的数字
	int mid = 0;//中间值的下标
	int find = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else
		{
			find = 1;
			break;
		}
	}
	if (find == 1)
		printf("找到了,下标为%d\n", mid);
	

	return 0;
}

函数

14. 写一个函数判断一年是否是闰年。

c 复制代码
#include<stdio.h>

int is_leap_year(int y)
{
	if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
		return 1;
	else
		return 0;
}

//测试函数
int main()
{
	int y;
	int input;
	int a;
	do//判断完是不是闰年后,可以接着判断,也可以选择退出
	{
		printf("请输入年份\n");
		scanf("%d", &y);
		input = is_leap_year(y);
		if (input == 1)
			printf("是闰年\n");
		if (input == 0)
			printf("不是闰年\n");
		printf("继续输入1,结束输入0\n");
		scanf("%d", &a);
	} while (a);
	
	return 0;
}

15.函数判断素数

c 复制代码
#include<stdio.h>
#include<math.h>//要用sqrt函数

int is_prime(int d)
{
	int i;
	for (i = 2; i < sqrt(d); i++)
	{
		if (0 == d % i)
			return 0;
	}
	return 1;//无法整除满足条件
}
int main()
{
	int i;
	for(i = 100; i <= 200; i++)//打印100到200的素数
	{
		is_prime(i);
		if (is_prime(i)==1)
		{
			printf("%d\n", i);
		}
	}
	
	return 0;
}

16.乘法口诀表

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

如:输入9,输出99口诀表,输出12,输出1212的乘法口诀表。

c 复制代码
void PrintMulTable(int n)
{
	
	int i, j;
	
	for (i = 1; i <= n; ++i)
	{
		for (j = 1; j <= i; ++j)
		{
			printf("%d*%d=%2d ", i, j, i * j);
		}
		printf("\n");
	}
	
}
//使用函数
int main()
{
	printf("hehe\n");
	int a = 12;
	PrintMulTable(a);
	
	return 0;
}

17.使用函数实现数组操作

创建一个整形数组,完成对数组的操作

1.实现函数init() 初始化数组为全0

2.实现print() 打印数组的每个元素

3.实现reverse() 函数完成数组元素的逆置。

要求:自己设计以上函数的参数,返回值。

c 复制代码
void Int(int arr[], int sz, int set)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		 arr[i] = set;
	}
}
void Print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void Reverse(int arr[], int sz)
{
	int i = 0;
	int left = 0;
	int right = sz - 1;
	int tmp;
	while (left <= right)
	{
		tmp = arr[right];
		arr[right] = arr[left];
		arr[left] = tmp;
		left++;
		right--;
	}

}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("hehe\n");
	
	Print(arr, sz);
	Reverse(arr, sz);
	Print(arr, sz);
	Int(arr, sz, 0);
	Print(arr, sz);
	return 0;
}

18...求 1!+2!+3!+4!+...10! 的和

c 复制代码
#include<stdio.h>

int main()
{
	int n;
	printf("求1到n的阶乘\n");
	printf("请输入n\n");
	scanf("%d ", &n);
	int i, j;
	int sum = 0;
	printf("开始计算\n");
	for (i = 1; i <= n; i++)
	{
		int ret = 1;
		
		for (j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}

19.喝汽水问题

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)。

c 复制代码
#include<stdio.h>

int main()
{
	int empty;
	int money;
	int total;

	scanf("%d", &money);

	total = money;
	empty = money;
	while (empty > 1)
	{
		total += empty / 2;
		empty = empty / 2 + empty % 2;
	}
	printf("total=%d\n", total);
	return 0;
}

20.打印菱形

用C语言在屏幕上输出以下图案:

c 复制代码
#include<stdio.h>

int main()
{
	int i, j;
	
	printf("请输入行数\n");
	int line;//(行数)
	scanf("%d", &line);
	int a;//(上半部分)
	int b;//(下半部分)
	b = line / 2;
	a = line-b ;
	
	for (i = 0 ; i < a; i++)
	{
		
		for (j = 0; j < a-i-1 ; j++)//(找规律)
		{
			printf(" ");
		}
		for (j = 0; j < 2*i+1 ; j++)//(等差递增)
		{
			printf("*");
			
		}
		printf("\n");///(记得换行)
	}

	for (i = 0; i <b ; i++)
	{
		for (j = 0; j <=i ; j++)//(正好与i的个数一样)
		{
			printf(" ");
		}
		for (j = 0; j <2*(b-i)-1 ; j++)//(等差递减)
		{
			printf("*");
		}
		printf("\n");
	}

	return 0;
}

21.打印水仙花数

求出0~100000之间的所有"水仙花数"并输出。

水仙花数"是指一个n位数,其各位数字的n次方之和确好等于该数本身,

如:153=1^ 3+ 5 ^ 3+3^3,则153是一个"水仙花数"。

c 复制代码
#include<stdio.h>
#include<math.h>

int main()
{
	int i;
	for (i = 1; i < 99999; i++)
	{
		int sum = 0;//每位数的次方和
		int count = 0;//位数
		int tmp = i;//存放水仙花数
		while (tmp != 0)
		{
			tmp /= 10;
			count++;
		}
		tmp = i;
		while (tmp)
		{
			sum += pow(tmp % 10, count);
			tmp /= 10;
		}
		if (sum == i)
		{
			printf("%d是水仙花数\n", i);
		}
	}
	return 0;
}

22.计算求和

求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,

例如:2+22+222+2222+22222

c 复制代码
#include<stdio.h>

int main()
{
	int i;
	int a;
	int n;
	int tmp=0;
	int sum=0;
	printf("请输入要求的数字和个数\n");
	scanf("%d %d", &a, &n);
	for (i = 0; i < n; i++)
	{
		tmp = tmp * 10 + a;//后面的每个数就是前面一个数乘上10再加上这个数
		sum += tmp;

	}
	printf("%d\n", sum);
	return 0;
}

23.计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。

c 复制代码
#include<stdio.h>

int Fact(int n)
{
	if (n == 0)
		return 1;
	else
		
		return n*Fact(n-1);
	
}

int main()
{
	printf("请输入要求的数字\n");
	int n = 0;
	scanf("%d", &n);
	Fact(n);
	int ret = Fact(n);
	printf("%d\n", ret);

	return;

}
c 复制代码
#include<stdio.h>

int main()
{
	int n = 0;//(求n的阶乘)
	printf("请输入n\n");
	scanf("%d", &n);
	int i = 0;
	int sum = 0;
	sum = n;//存放阶乘
	int a = 0;
	a = n;
		
	for (i = 1; i < a; i++)
	{
		
		sum *= (n - 1);
		n = n - 1;
		
		
	}
	printf("%d\n", sum);
	return 0;
}

24.输入一个整数m,按照顺序打印整数的每一位。

c 复制代码
#include<stdio.h>

void Print(int n)
{
	
	if (n > 9)
	{
		Print(n / 10);

	}
	printf("%d ", n%10);
}

int main()
{
	printf("请输入要打印的数字\n");
	int m = 0;
	scanf("%d", &m);
	Print(m);
	printf("\n");
	return 0;
}

递归

25.求第n个斐波那契数

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

c 复制代码
#include<stdio.h>



int Fib(int n)
{
	if (n < 2)
	{
		return n;
	}
	else
	{
		return Fib(n - 1) + Fib(n - 2);
	}
}

int main()
{
	printf("请输入要求的是第几个斐波那契数\n");

	int n = 0;
	scanf("%d", &n);

	int ret;
	ret = Fib(n);
	printf("第%d个斐波那契数是%d\n",n, ret);
	return 0;
}
c 复制代码
#include<stdio.h>

int Fib(int n)

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

int main()
{
	printf("请输入要求的是第几个斐波那契数\n");
	
	int n = 0;
	scanf("%d", &n);
	
	int ret;
	if (n <= 2)
	{
		ret = 1;
		
	}
	
	else
	{
		ret = Fib(n);
	}
	printf("第%d个斐波那契数是%d\n", n, ret);
	return 0;
}

26.青蛙跳台阶问题

一只青蛙一次可以跳一级台阶或两级台阶,问每级台阶有几种跳法

c 复制代码
#include<stdio.h>
//观察可知,每级台阶的跳法为前两级台阶的跳法之和
int Jump(int n)
{
	int ret;
	if (n <= 2 )
	{
		ret = n;
	}
	else
	{
		ret = Jump(n - 1) + Jump(n - 2);
	}
	return ret;
}

int main()
{
	printf("请输入青蛙要跳几级台阶\n");
	int n;
	scanf("%d", &n);
	int ret;
	ret = Jump(n);
	printf("青蛙跳%d台级阶有%d种跳法\n",n,ret);
	return 0;
}

27. 汉诺塔问题

汉诺塔问题:即在一个装置上有A,B,C三根杆。

在A杆自下而上、由大到小按顺序放置n个圆盘,

我们需要保存原有顺序把A杆上的圆盘全部移到C杆上。

操作过程中,每次只能移动一个圆盘,

并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,

操作过程中盘子可以置于A、B、C任一杆上。

1.求次数

c 复制代码
#include<stdio.h>

int hanoi_num(int n)
{
	if (n > 1)
	{
		return 2 * hanoi_num(n - 1) + 1;
	}
	else
	{
		return 1;
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	printf("次数为:%d", hanoi_num(n));
	return 0;
}

2.求步骤

c 复制代码
#include<stdio.h>


void hanoi_move(int n, char A, char B, char C)
//参数A,B,C分别为所在杆,中间杆,目标杆
{
	if (n > 1)
	{
		//传入的参数为当前情况下的所在杆,中间杆,目标杆
		hanoi_move(n - 1, A, C, B);
		printf("%c -> %c\n", A, C);
		hanoi_move(n - 1, B, A, C);
	}
	else
	{
		printf("%c -> %c\n", A, C);
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	hanoi_move(n, 'A', 'B', 'C');
	return 0;
}

28.递归实现n的k次方

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

c 复制代码
#include<stdio.h>

int Pow(int n, int k )
{
	if (k == 0)
	{
		return 1;
	}
	else
	{
		return n * Pow(n,k - 1);
	}
}


int main()
{
	printf("请输入要求什么数的几次方\n");
	int n;
	scanf("%d", &n);
	int k;
	scanf("%d", &k);
	int ret;
	ret = Pow(n, k);
	printf("计算结果为:%d\n",ret);
	return 0;

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

写一个递归函数DigitSum(n),输入一个非负整数,

返回组成它的数字之和

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729,输出:19

c 复制代码
#include<stdio.h>

int DigitSum(int n)
{
	if (n <= 9)
	{
		return n;
	}
	else
	{
		return DigitSum(n / 10) + DigitSum(n % 10);
	}
}


int main()
{
	printf("请输入要计算的数字\n");
	int n;
	scanf("%d", &n);
	int ret;
	ret = DigitSum(n);
	printf("值为%d\n", ret);
	return 0;
}

操作符

30.不能创建临时变量(第三个变量),实现两个整数的交换。

c 复制代码
#include<stdio.h>

int main()
{
	int a;
	int b;
	printf("请输入要交换的两个数\n");
	scanf("%d %d", &a, &b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a = %d b = %d", a, b);

	return 0;
}

31.编写代码实现:求一个整数存储在内存中的二进制中1的个数。

c 复制代码
#include<stdio.h>

int Calculate(int x)
{
	int count = 0;
	while (x)
	{
		count++;
		x = x & (x - 1);
	}
	return count;
}

int main()
{
	int ret = 0;
	printf("请输入要计算的数字\n");
	int x;
	scanf("%d", &x);
	ret = Calculate(x);
	printf("数字中二进制中的1的个数为%d\n", ret);
	return 0;
}

32.二进制位置0或者置1

c 复制代码
#include<stdio.h>

int main()
{
	int a = 13;
	//0000000000000000000001101
	//0000000000000000000011101 将第五位置1
	//0000000000000000000001101 再将第五位置0
	a = a | (1 << 4);
	printf("打印第五位置1后的值:%d\n",a);//29
	a = a & ~(1 << 4);
	printf("打印置为0的值:%d\n",a);
	return 0;
}

33.单身狗1

在一个整型数组中,只有一个数字出现一次,

其他数组都是成对出现的,请找出那个只出现一次的数字。

例如:

数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,

其他数字都出现2次,找出5

c 复制代码
#include<stdio.h>


int Find_single_dog(int arr[], int sz)
{
	int ret = 0;
	int i;
	for ( i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	return ret;
}

int main()
{
	int arr[9] = { 1,2,3,4,5,1,2,3,4 };
	int sz = sizeof(arr) /sizeof(arr[0]);
	int ret = Find_single_dog(arr,sz);
	printf("只出现一次的数字是%d\n", ret);
	return 0;
}

34.打印整数二进制的奇数位和偶数位

获取一个整数二进制序列中所有的偶数位和奇数位,

分别打印出二进制序列

c 复制代码
#include<stdio.h>

void Printbit(n)
{
	int i = 0;
	int j = 0;
	for (i = 31; i >= 1; i-=2)
	{
		printf("%d ", (n >> i) & 1);
	}
	printf("\n");
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ",(n >> i) & 1);
	}
	printf("\n");
}

int main()
{
	printf("请输入一个整数:\n");
	int n;
	scanf("%d", &n);
	Printbit(n);
	return 0;
}

35.求两个数二进制中不同位的个数

编程实现:

两个int(32位)整数m和n的二进制表达中,

有多少个位(bit)不同?

输入例子:

1999 2299

输出例子:7

c 复制代码
#include<stdio.h>

int main()
{
	int a, b;
	printf("请输入两个整数:\n");
	scanf("%d %d", &a, &b);
	int count = 0;
	int n = 32;
	int tmp;
	tmp = a ^ b;
	while (tmp)
	{
		 
		tmp = tmp & (tmp - 1);
		count++;
	}
	int ret = count;
	printf("有%d位不同\n",ret);

	return 0;
}

总结

归纳了30道在学习指针前的基础练习,希望反复练习,需掌握

相关推荐
EricWang135843 分钟前
[OS] 项目三-1-proc.c: fork()探求
c语言·c++
摆烂小白敲代码2 小时前
背包九讲——背包问题求具体方案
c语言·c++·算法·背包问题·背包问题求具体方案
磁悬浮青蛙呱呱呱2 小时前
C语言自编以e为底的对数函数ln,性能接近标准库函数
c语言·初等函数·fmadd指令加速
xujiaqi_china3 小时前
C语言第11节:指针(1)
c语言
Liquor14194 小时前
vim 编辑器
java·linux·c语言·开发语言·python·编辑器·vim
921正在学习编程4 小时前
数据结构之排序--选择排序
c语言·数据结构·算法·排序算法
平头哥在等你5 小时前
求100之内的素数
c语言·开发语言·算法
小菜鸟学代码··5 小时前
c设备io
c语言·开发语言·前端
学无止境\n6 小时前
[C语言]多组输入的几种方法
c语言·开发语言