作者:你我皆为凡人
博客主页:你我皆为凡人的博客
名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!
觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!
系列作品:
牛客网练习习题入口
C语言编程刷题篇
经典题型系列
目录
前言
BC117 小乐乐走台阶
描述
输入描述:
输出描述:
示例1
示例2
解析:
BC98 序列中删除指定数字
描述
输入描述:
输出描述:
示例1
示例2
解析:
下面代码的结果是:( )
解析:
两个整数二进制位不同个数
编程实现:
输入例子:
输出例子:
解析:
打印整数二进制的奇数位和偶数位
编程实现:
解析:
统计二进制中1的个数
编程实现:
解析:
字符串逆序
编程实现
输入
输出
解析:
计算求和
编程实现
解析:
打印水仙花数
编程实现
解析:
习题练习入口
题外话
本人也是一名新手,在刷题过程中有很多困惑,有什么不会的也搜索过,但是都是直接代码图,也不知道怎么解决,所以想自己写一些我做过的一些编程题和一些比较坑的题目的详解,希望可以帮助到一些还不会的人
提示:以下是本篇文章正文内容,下面案例可供参考
描述
小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?
输入描述:
输入包含一个整数n (1 ≤ n ≤ 30)
输出描述:
输出一个整数,即小乐乐可以走的方法数。
示例1
输入:
2输出:
2示例2
输入:
10输出:
89解析:
我们可以发现 如果上一步台阶的话 小乐乐可以有一种走法,如果上两步台阶的话,小乐乐无非就是走一阶或者走两阶,有两种,那么假如需要走10阶台阶呢?如果一步一阶,那么剩下9阶,如果一步两阶,剩下8阶,那么我们封装的fib函数无非就是计算n阶台阶的走法,我们可以使用递归的方法,如果大于2的情况下返回fib(n-1)+fib(n-2) 就是n阶的方法
比如n为10,第一步为1阶,那么剩下9个台阶,fib(9),计算剩下9个台阶有几种走法,第一步为2阶,那么剩下8个台阶,fib(8),计算剩下8个台阶有几种走法,那么fib(10)就等于fib(9)+fib(8)
#include
int fib(int n)
{
if(n>2)
return fib(n-1)+fib(n-2);
else
return n;
}
int main()
{
int n = 0;
scanf("%d",&n);
int ret = fib(n);
printf("%d",ret);
return 0;
}
描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1 \le n \le 501≤n≤50
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
示例1
输入:
6 1 2 3 4 5 9 4输出:
1 2 3 5 9复制
示例2
输入:
5 1 2 3 4 6 5输出:
1 2 3 4 6解析:
这道题有很多种解决方法,我们可以有两个数组一个存放原来的,在和删除的比较,如果不是,放到另外一个数组里,最后另外一个数组就是要打印的,输入就不解释了,我们可以定义一个i和j,同时放到一组数的刚开始,如果i不是要删除的数,把i存放到j里,i++,j++,如果i是删除的数字,那么j还是在原来的地方不懂,i继续加加,直到i等于n,那么在j之前的数就是最后要打印的一组数
int main()
{
//输入一个整数
int n = 0;
scanf("%d",&n);
int arr[n];
//输入n个整数
int i = 0;
for(i=0;i
#include
int main()
{
int a, b, c;
a = 5;
c = ++a;
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("a = %d b = %d c = %d\n:", a, b, c);
return 0;
}
A.a = 8 b = 23 c = 8
B.a = 9 b= 23 c = 8
C.a = 9 b = 25 c = 8
D.a = 9 b = 24 c = 8
解析:
++运算符:分为前置++和后置++,
前置++:先加1,后使用,即先使用变量中内容,然后给结果加1
后置++:先使用变量中内容,整个表达式结束时,给变量加1
逗号表达式,取最后一个表达式的值。
此题的坑点在于优先级与前置后置++的应用
#include
int main()
{
int a, b, c;
a = 5;
c = ++a;// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6 c = 6
b = ++c, c++, ++a, a++;
// 逗号表达式的优先级,最低,这里先算b=++c, b得到的是++c后的结果,b是7
// b=++c 和后边的构成逗号表达式,依次从左向右计算的。
// 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7
b += a++ + c; // a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9
printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8
return 0;
}
编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:
7
解析:
两位数的二进制进行比较,每个整数的二进制位有32位,让每一位可以移动到最低位然后按位与一个1得到这个位,然后进行比较,如果不等的情况下,count++,最后的count的位数就是结果
int fib(int m, int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((m >> i) & 1) != ((n >> i) & 1))
{
count++;
}
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int ret = fib(m, n);
printf("%d", ret);
return 0;
}
编程实现:
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
解析:
一个整数的二进制有32位,但是第一位是符号位所以不算,那么偶数应该从31开始,大于等于1,每次减去二,打印这个数向右移动i位然后按位与上1,那么奇数同理
int main()
{
int n = 0;
scanf("%d", &n);
int i = 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));
}
return 0;
}
编程实现:
写一个函数返回参数二进制中1的个数
解析:
我们获取一个十进制整数最低位的时候,可以取模10然后除以10得到最低位,那么二进制同样可以取模10然后除以10,我们这里介绍一种方法,一个二进制有32位,我们要得到2进制的最低位,那么让这个数每次右移i为,然后按位与上1,如果结果为1,那么count++,最后返回的count就是结果
int fib(int n)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d", ret);
return 0;
}
编程实现
将一个字符串str的内容颠倒过来,并输出。
数据范围:1≤len(str)≤10000 1 \le len(str) \le 10000\ 1≤len(str)≤10000
输入一个字符串,可以有空格
输出逆序的字符串
示例
输入
I am a student输出
tneduts a ma I解析:
要求是将一串字符串逆序打印,数据要求是小于等于10000,创建一个10001的字符数组,可以多出一个放\0,因为字符串中还有空格,而scanf中遇到空格就不会继续打印,所以使用gets函数,将字符串打印可以定义一个左下标与右下标,左边为启示位置0,右边为长度减1,可以将两边置换,然后左边加加,右边减减,因为是循环,所以盘低昂条件为当左边小于右边的时候进行置换
int main()
{
char arr[10001] = { 0 };
gets(arr);
int left = 0;
int right = strlen(arr)-1;
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s", arr);
return 0;
}
编程实现
求Sn=a+aa+aaa+aaaa+aaaaa的前n项之和,其中a是一个数字,
例如:2+22+222+2222+22222
解析:
输入就不再多说,a的前n项之和,如果a是2,那么第二项等于 2*10+2,第三项等于22*10+2,那么我们定义一个k与sum,k等于0,第一项2等于0*10+2=2,然后赋值给k,然后sum+=k,最后sum就是a的前n项之和
int main()
{
int a = 0;
int n = 0;
scanf("%d %d", &a,&n);
int i = 0;
int k = 0;
int sum = 0;
for (i = 0; i < n; i++)
{
k = k * 10 + a;
sum += k;
}
printf("%d", sum);
return 0;
}
编程实现
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
解析:
先确定是0到100000之间的数,水仙花数是一位n位数,各位数字的n次方之和等于该数本书,所以我们第一步需要先知道这个数是几位数,定义一个n,如何确定呢?如1234这个数,i/10每次减去个位数,减去一个代表是一位数,但是这是在循环内部,不可以随意改动i的值,所以定义一个中间变量等于i,循环往复,如果tmp/10不等于0就进去n++;然后tmp=tmp/10的结果,上去在执行,直到tmp/10为0,这样我们得到了i是n位数
接下来我们求i的每个数的次方之和,同时再把i赋给tmp,求次方数用到pow,1234%10为4,4的n次方加到sum里,然后1234=1234/10,当tmp等于0的时就停下来,如果当sum等于i的时候,就代表这个数是一个水仙花数,然后打印出来
//求出0~100000之间的所有“水仙花数”并输出。
//“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身
//如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。
#include
#include
int main()
{
int i = 0;
for (i = 0; i <= 100000; i++)
{
//1,先确定i是n位数
int n = 1;//n至少是1位数
int tmp = i;//不可在循环内部直接改变i的值
int sum = 0;
while (tmp / 10)
{
n++;
tmp /= 10;
}
//2,确定每位数字的n次方之和
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, n);
tmp /= 10;
}
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
看完这些不具体操作操作那么是不可以的,可以点击上方直达去练习一些有关习题,也可以随便看一看C语言的一些习题,练习练习选择题和编程题,让自己的知识得到巩固,直接点入标题就可直达,另外想获得大厂内推资格也可以去看看:
大厂内推
大家不想看可以跳过这一段,本人三年被脸上痘印折磨的死去活来,想过很多办法,后来用对了产品慢慢改善的变好,也是大学生创业搞的一个小产品,质量很好,大家有同样的困扰可以来询问我
微信号:lpy16128227