C语言编程笔试题(一)

一、斐波那契数列


  今天博主在练习题时碰见了一道有关斐波那契数列的题目,令博主一时无了头绪,后来搞清楚斐波那契数列的性质及有关知识后,现在分享给大家。

  我先给不了解斐波那契数列的同学普及一下斐波那契数的概念及有关知识。
在这里插入图片描述
斐波那契数列就是

0 1 1 2 3 5 8 13 21 34 … F(n)=F(n-1)+F(n-2)的递推数列

先看一道简单的题目——计算斐波那契数列


题目名称:

计算斐波那契数

题目内容:

递归和非递归分别实现求第n个斐波那契数

例如:

输入:5 输出:5

输入:10, 输出:55

输入:2, 输出:1

实现代码


1.非递归方式

在这里插入图片描述

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	/*int ret=Fac(n);
	printf("%d\n", ret); */
	
	int f1 = 0;
	int f2 = 1;
	int f3 ;
	int i = n - 2;
	while (i)
	{
		f3 = f1 + f2;
		f1 = f2;
		f2 = f3;
		i--;
	}
	printf("%d\n", f3);


		return 0;
}

2.递归方式

#include <stdio.h>

int Fac(int n)
{
	if (n == 1)
		return 0;
	else if (n == 2 || n == 3)
		return 1;
	else 
		return Fac(n-1) + Fac(n-2);
}
 
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret=Fac(n);
	printf("%d\n", ret); 
	return 0;
}

好了,了解了斐波那契数列的计算方式,我们来正式引入今天的题目


题目

  Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。
给你一 个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X - 1或者X + 1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

输入描述:

  输入为一个正整数N(1 ≤ N ≤ 1, 000, 000)

输出描述

  输出一个最小的步数变为Fibonacci数

示例:

  输入 15

  输出 2

#include <stdio.h>
#include <math.h>

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int f1 = 0;
	int f2 = 1;
	int f3 = 0;
	while (1)
	{
        f3 = f1 + f2;
        f1 = f2;
		f2 = f3;
		if (n == f2)
		{
			printf("%d\n", 0);
			break;
		}
			
		else if (n < f2)
		{
			if (abs(f2 - n) < abs(f1 - n))
			{
				printf("%d\n", abs(f2 - n));
				break;
			}
			else if (abs(f2 - n) > abs(f1 - n))
			{
				printf("%d\n", abs(f1 - n));
				break;
			}
		}	
	}
	return 0;
}

注意:abs()函数时求绝对值的函数,需要引入<math.h>的头文件


写题的步骤


1.先读懂题目,很多小伙伴们因为题目很长,看不懂,因此放弃了该题。

  我们来具体分析一下

  例如: 我们输入了一个数字 15,他不是斐波那契数在这里插入图片描述
  15 在 13和21的中间,我们需要得到的时15变成斐波那契数的最短步数,那么我们就需要将| 21-15 | 和 | 15 -13 |的绝对值进行比较,得到的较小数就是我们的答案。

2.要明确 我们需要找到我们输入这个数字的两边的斐波那契数,然后差的绝对值进行比较。


二、字符串空格替换

  这是一道很常见的题目,但是平时我们都没有注意到,例如我在百度的搜索栏中搜索 张三[空格]李四,出现的结果如下。

在这里插入图片描述
好了,进入正题。

题目名称:

字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”。

效果

we are happy.

we%20are%20happy.

实现代码

#include <stdio.h>
#include <string.h>

void blankreplace(char *str, int length)
{
	int i = 0;
	int count = 0;
	//  计算字符串中存在的空格数
	for (i = 0; i < length; i++)
	{
		if (str[i] == ' ')
			count++;
	}

	//计算加上替换成%20之后新字符串的长度
	//算出字符串最后的位置
	int newlen = length + 2 * count;

	int pos = newlen - 1;

	//字符串从后向前替换不会覆盖
	for (i = length-1; i >= 0; i--)
	{
		if (str[i] != ' ')
		{
			str[pos--] = str[i];
		}
		else if (str[i] == ' ')
		{
			str[pos--] = '0';
			str[pos--] = '2';
			str[pos--] = '%';
		}
	}
}


int main()
{
	char str[200] = "we are happy";
	int len = strlen(str);
	blankreplace(str,len);
	printf("%s\n", str);
	return 0;
}


注意:我们改变了字符串的长度,所以在原字符串中一定要留有足够的空间还能进行替换。


思考步骤

1.计算字符串中存在的空格数

2.计算加上替换成%20之后新字符串的长度

3.算出字符串最后的位置

4.字符串从后向前替换不会覆盖





好了,本次的分享就到这里,希望大家多多练习,谢谢欣赏~~






未完待续!!!



C语言编程笔试题(二)已更新

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RAIN 7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值