C语言必做30道练习题
C语言练习30题(分支循环,数组,函数,递归,操作符)
目录
- 分支循环
- 1.闰年的判断
- 2.阅读代码,计算代码输出的结果
- 3.输入一个1~7的数字,打印对应的星期几
- 4.输入任意一个整数值,计算除3之后的余数
- 5.输入一个人的年龄
- 6.输入一个年龄,>= 18岁就输出:成年,否则就输出:未成年
- 7.输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。
- 8.计算1~100之间3的倍数的数字之和
- 9.输入一个正整数,逆序打印这个整数的每一位
- 10.输入一个正整数,计算这个整数是几位数?
- 11.找出100~200之间的素数,并打印在屏幕上。
- 数组
- 12. 多个字符从两端移动,向中间汇聚
- 13. 二分查找
- 函数
- 14. 写一个函数判断一年是否是闰年。
- 15.函数判断素数
- 16.乘法口诀表
- 17.使用函数实现数组操作
- 18..求 1!+2!+3!+4!+...10! 的和
- 19.喝汽水问题
- 20.打印菱形
- 21.打印水仙花数
- 22.计算求和
- 23.计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。
- 24.输入一个整数m,按照顺序打印整数的每一位。
- 递归
- 25.求第n个斐波那契数
- 26.青蛙跳台阶问题
- 27. 汉诺塔问题
- 1.求次数
- 2.求步骤
- 28.递归实现n的k次方
- 29.计算一个数的每位之和(递归实现)
- 操作符
- 30.不能创建临时变量(第三个变量),实现两个整数的交换。
- 31.编写代码实现:求一个整数存储在内存中的二进制中1的个数。
- 32.二进制位置0或者置1
- 33.单身狗1
- 34.打印整数二进制的奇数位和偶数位
- 35.求两个数二进制中不同位的个数
- 总结
分支循环
1.闰年的判断
闰年判断的规则:
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
#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.阅读代码,计算代码输出的结果
#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 输出:星期天
#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之后的余数
#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岁及以上打印"老寿星"
#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岁就输出:成年,否则就输出:未成年
#include <stdio.h>
int main()
{
int age = 0;
printf("请输入年龄\n");
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
7.输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。
#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的倍数的数字之和
#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
#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
#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和本身整除的数字。
#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. 多个字符从两端移动,向中间汇聚
编写代码,演示多个字符从两端移动,向中间汇聚
#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比较大的时候可能存在问题,可以使用下面的代码:
mid = left+(right-left)/2;
#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. 写一个函数判断一年是否是闰年。
#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.函数判断素数
#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的乘法口诀表。
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() 函数完成数组元素的逆置。
要求:自己设计以上函数的参数,返回值。
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! 的和
#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元,可以喝多少汽水(编程实现)。
#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语言在屏幕上输出以下图案:
#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是一个“水仙花数”。
#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
#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的数字累积相乘。
#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;
}
#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,按照顺序打印整数的每一位。
#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个斐波那契数
#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;
}
#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.青蛙跳台阶问题
一只青蛙一次可以跳一级台阶或两级台阶,问每级台阶有几种跳法
#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.求次数
#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.求步骤
#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次方,使用递归实现。
#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
#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.不能创建临时变量(第三个变量),实现两个整数的交换。
#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的个数。
#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
#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
#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.打印整数二进制的奇数位和偶数位
获取一个整数二进制序列中所有的偶数位和奇数位,
分别打印出二进制序列
#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
#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道在学习指针前的基础练习,希望反复练习,需掌握