C语言刷题系列,经典C语言易错题目.

C语言刷题系列,经典C语言易错题目.

导入

这是我们C语言刷题系列第一期,本系列的目的就是记录解决一些经典题目,对C语言编程能力的提高,培养编程思维的目的。

题目1——缩短二进制

C语言刷题系列,经典C语言易错题目._第1张图片
这道题相对来说是比较简单的没有输入,直接输出1234的八进制和十六进制即可。注意这里还有一个知识点是用“#”控制前导显示,什么意思呢,就是说我们都知道八进制是0开头的,十六进制是0X开头来表示的,我们可以自己输出的时候手动输入,也可以直接用“#”来自动补充,所以这道题的答案就很显然了,代码如下

#include
int main()
{
	printf("%#o\n",1234);
	printf("%#X\n",1234);
	return 0;
}

运行结果就不贴图了,推荐大家自己去尝试写。

题目2——十六进制转十进制

C语言刷题系列,经典C语言易错题目._第2张图片
注意这里也是一个新的知识点,如何输出时指定域宽,格式就是“%md”,意思为输出域宽为m的十进制整数,代码如下

#include
int main()
{
	printf("%15d",0XABCDEF);
	return 0;
}

至于以15域宽输出的效果就等大家自己去尝试了。

题目3——printf的返回值

C语言刷题系列,经典C语言易错题目._第3张图片
printf也是一个函数,也是有返回值的,这点因为用的不多可能大家平时也不会注意,我们来写一下这个题目,看一下,代码如下:

#include
int main()
{
	int i = printf("hello world");
	printf("\n");
	printf("%d\n", i);
	return 0;
}

当然这个代码也可以用一行直接来表示,

#include
int main()
{
	printf("\n%d\n", printf("hello world"));
	return 0;
}

两种均可;

题目4——反向输出一个四位数

C语言刷题系列,经典C语言易错题目._第4张图片
题目描述的很清楚,我们需要输入一个四位数然后将其每个数字倒过来再去输出,我们要先理清思路,一个四位数我如何能先得到它的第四位呢,没错,我们只要将它%10就可以,那么依次可以得到第四位,第三位…然后依次打印出来即可,那么首选的肯定是用循环来实现.代码如下:

#include
int main()
{
	int i = 0;
	int ret = 0;
	scanf("%d",&i);
	while (i)
	{
		ret=i % 10;
		printf("%d", ret);
		i /= 10;
	}
	return 0;
}

题目5——出生日期输入输出

C语言刷题系列,经典C语言易错题目._第5张图片
这道题目也是又新的知识点需要学习,%m用来指定位宽我们已经知道了,那么当我们的位宽有的位不够怎么来指定用0来补足呢,这时候就要用%0表示,用0来补足,我们来看代码:

#include
int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%4d%2d%2d",&year,&month,&day);
	printf("%4d %02d %02d",year,month,day);
	return 0;
}

题目6——打印素数

在这里插入图片描述
让我们写一个代码来打印素数,其实这是一道非常经典的题目,我们今天只来以一种方法试除法示例,首先我们要知道素数怎么求,素数也叫质数,只有1和它本身能整除的数,基本思路就是我们要先有了100~200之间的数,然后再去判断每一个数是否是素数,当我们将2到这个数减一都试过一遍均不能整除的时候,就意味着这个数是素数,代码如下:

#include
int main()
{
	int i =0;
	for (i = 100; i <= 200; i++)
	{
		int j = 2;
		for (j = 2; j < i - 1; j++)
		{
			if (i % 2 == 0)
				break;
		}
		if(i%2!=0)
		printf("%d ",i);
	}
	return 0;
}

这里我们仅仅是打印100~200之间的素数,计算量还是非常小的,如果我们要的数据量太大的话,你会发现这个程序的效率就太低了,每一个数都要从2试除到它减一,所以我们要想办法将代码进行优化,我们可以先想一下,当我们要判断一个数的时候我们假如已经试除过了3,然而我们后面还要试9,27…这里是否就多试了很多次,所以我们仔细想一下,我们只要试除到这个数的开平方根即可,而在C语言中的开平方又要使用一个**新的函数sqrt****,这个函数是专门用来开平方根使用的,当然了每一个函数都有其对应的头文件,所以我们还要引用math.h这个头文件,**所以优化过后的代码就变成了下面;

#include
#include
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 2;
		for (j = 2; j < sqrt(i); j++)
		{
			if (i % 2 == 0)
				break;
		}
		if (i % 2 != 0)
			printf("%d ", i);
	}
	return 0;
}

当然了,这肯定还不是最优解,今天我们只在这里分析一下此题目最基本的思路和方法,如果有兴趣深入学习的可以去搜索一篇文章叫做**素数求解的n种境界,**里面是一个面试官对这道题的详细解读,为什么这道题会是公司面试时的一道最经典题目之一。

题目7——二分查找

C语言刷题系列,经典C语言易错题目._第6张图片
这道题目的意思呢,其实也很简单,假设有一个数组1234567910,我们如果要找到其中7,并且将它的下标打印出来,那么我们该如何做呢,最最基本的的当然是挨个找,但是同样的问题,效率实在是太低了,所以我们要学习一下二分查找的方法,也叫折半查找法。
这个方法的基本思路是怎样的呢?我们知道1的下标是0,10的下标是9,所以我们取这俩个数中间的那个值,也就是下标为4的数,就是5,5比我们要找的7要小,所以我们要下标加一,将6和10再取中间值来和7进行判断,依次这样循找,直到下标对应的数为7就可以停下来。
那么具体是怎么实现的呢?代码如下:

#include
int main()
{
	int flag = 0;
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int left = 0;
	int right = 9;
	int mid = 0;
	int k = 0;
	scanf("%d",&k);
	while (left <= right)
	{
		mid=(left + right) / 2; //求中间值
		//判断和调整来寻找k
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			flag = 1;
			break;
		}
	}
	//if (left>right)
	if(flag==0)
		printf("找不到\n");
	return 0;
}

这里就我我完整的代码实现过程,这已经是最坏的情况,如果我们要在20亿个数字中来找一个数呢,一下我们就可以干掉一半数,每一次一半,这样来看我们的二分查找法效率是非常高的,当然了也有它的局限性,这种方法只能用在有序的数列里面,仔细体会一下。
好了,这一期的C语言刷题系列第一期就写到这里了,看起来内容量还是非常多的,在学习编程这件事上,一定要坚持下去,共勉.

你可能感兴趣的:(c语言,c++,算法,1024程序员节,开发语言)