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或者置133.单身狗134.打印整数二进制的奇数位和偶数位35.求两个数二进制中不同位的个数 总结
分支循环
1.闰年的判断
闰年判断的规则:
能被4整除并且不能被100整除是闰年能被400整除是闰年#include <stdio.h>//代码1int main(){int year = 0;scanf("%d", &year);if(year%4==0 && year%100!=0)printf("是闰年\n");else if(year%400==0)printf("是闰年\n");elseprintf("不是闰年\n");return 0;}//代码2int 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");elseprintf("余数是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");elseprintf("老寿星\n");return 0;}
6.输入一个年龄,>= 18岁就输出:成年,否则就输出:未成年
#include <stdio.h>int main(){int age = 0;printf("请输入年龄\n");scanf("%d", &age);if (age >= 18)printf("成年\n");elseprintf("未成年\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);elseprintf("%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;elsereturn 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;elsereturn 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 再将第五位置0a = a | (1 << 4);printf("打印第五位置1后的值:%d\n",a);//29a = 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道在学习指针前的基础练习,希望反复练习,需掌握