【C语言】这些经典题型大家都掌握了吗?一文学会这些题

  作者:你我皆为凡人

 博客主页:你我皆为凡人的博客

 名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!

 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

 系列作品:

 牛客网练习习题入口

 C语言编程刷题篇

 经典题型系列

 

 【C语言】这些经典题型大家都掌握了吗?一文学会这些题_第1张图片

 

目录

前言

BC117 小乐乐走台阶

描述

输入描述:

输出描述:

示例1

示例2

解析:

BC98 序列中删除指定数字

描述

输入描述:

输出描述:

示例1

示例2

解析:

下面代码的结果是:( )

解析:

两个整数二进制位不同个数

编程实现:

输入例子:

输出例子:

解析:

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

编程实现:

解析:

统计二进制中1的个数

编程实现:

解析:

字符串逆序

编程实现

输入

输出

解析:

计算求和

 编程实现

解析:

打印水仙花数

编程实现 

解析:

 习题练习入口

题外话

 

前言

本人也是一名新手,在刷题过程中有很多困惑,有什么不会的也搜索过,但是都是直接代码图,也不知道怎么解决,所以想自己写一些我做过的一些编程题和一些比较坑的题目的详解,希望可以帮助到一些还不会的人


提示:以下是本篇文章正文内容,下面案例可供参考

 

BC117 小乐乐走台阶

描述

小乐乐上课需要走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;
}

BC98 序列中删除指定数字

描述

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。

 

数据范围:序列长度和序列中的值都满足 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的个数

编程实现:

写一个函数返回参数二进制中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

 【C语言】这些经典题型大家都掌握了吗?一文学会这些题_第2张图片

 

 

你可能感兴趣的:(C语言编程刷题篇,c语言,开发语言)