教你学会斐波那契数与字符串中空格转字符问题

系列文章目录



一、斐波那契数

1.斐波那契数定义

斐波那契数列为1、1、2、3、5、8、13、21、34……此数列从第3项开始,每一项都等于前两项之和,递推公式为F(n)=F(n-1)+F(n-2),n≥3,F(1)=1,F(2)=1

2.斐波那契数类型题目

1.求解斐波那契数

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377…这个数列从第3项开始,每一项都等于前两项之和。
代码如下:

#define _CRT_SECURE_NO_WARNINGS   1
#include<stdio.h>
#include<malloc.h>
long long* Fibonacci(size_t N)//size_t是无符号的数
{
    
    
	unsigned int n = 0;
	long long* FibArray = malloc(sizeof(long long)*(N + 1));//用空间来换时间
	FibArray[0] = 0;
	if (N == 0)
	{
    
    
		return FibArray;
	}
	FibArray[1] = 1;
	for (n = 2; n <= N; n++)
	{
    
    
		FibArray[n] = FibArray[n - 1] + FibArray[n - 2];
	}
	return FibArray;
}
int main()
{
    
    
	int i = 0;
	printf("请输入一个数:");
	scanf("%d", &i);
	long long* ret = Fibonacci(i);
	printf("该数的斐波那契数是:%d\n", ret);
	return 0;
}
2.求解一个数几步成为斐波那契数

假设一个数和斐波那契数比较
1.如果两数相等,步数为0。
2.如果数小于斐波那契数且存在斐波那契数中间,用绝对值函数abs求出相差的步数。
3.如果数不在斐波那契数中间,则用赋值一步一步往前直到数存在于两个斐波那契数中。
代码如下:

#define _CRT_SECURE_NO_WARNINGS   1
#include<stdio.h>
#include<math.h>
int main()
{
    
    
	int n = 0;
	scanf("%d", &n);
	int a1 = 0;
	int a2 = 1;
	int a3 = 0;
	while (1)
	{
    
    
		if (n == a2)
		{
    
    
			printf("%d\n", 0);
			break;
		}
		else if (n < a2)	
		{
    
    
			if (abs(a1 - n)<abs(a2) - n)
			{
    
    
				printf("%d\n", abs(a1 - n));
			}
			else
			{
    
    
				printf("%d\n", abs(a2 - n));
			}
			break;
		}
		a3 = a1 + a2;
		a1 = a2;
		a2 = a3;
	}
	return 0;
}

在这里插入图片描述

二、字符串中空格转为符号

1.题目意思解读

存在一个字符数组,假如字符数组中有字符串“we are happy”其中中间两个空格转换为%20。

2.题目解题思路

1.先寻找字符串中空格个数
2.计算新的字符串把空格替换成%20新的长度,找到新的下标
3.从后往前处理空格

代码如下:

#define _CRT_SECURE_NO_WARNINGS   1
#include<stdio.h>
#include<string.h>
void ReplaceSpace(char* str, int length)
{
    
    
	int i = 0;
	int spacecount = 0;
	for (i = 0; i < length; i++) //1.统计空格个数
	{
    
    
		if (str[i] == ' ')
		{
    
    
			spacecount++;
		}
	}
	int newlen = length + 2 * spacecount; //2.算出替换了%20后字符串新的长度的最后位置
	int pos = newlen - 1;  //计算最后一个字符的下标
	for (i = length - 1; i >= 0; i--) //3.从后往前处理空格
	{
    
    
		if (str[i] == ' ')
		{
    
    
			str[pos--] = '0';
			str[pos--] = '2';
			str[pos--] = '%';
		}
		else //不是空格就在原来字符重新拷贝过去到arr的后面
		{
    
    
			str[pos--] = str[i];
		}
	}
}
int main()
{
    
    
	char arr[1024] = "we are happy.";
	int len = strlen(arr);
	ReplaceSpace(arr, len);
	printf("%s\n", arr);
	return 0;
}

在这里插入图片描述


总结

<font color=#999AAA 以上就是今天要讲的两种类型的题目,本文仅仅简单介绍了斐波那契数的使用,而字符串种空格替换为别的字符也是常见题目,希望大家多多注意!另外,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。
在这里插入图片描述

扫描二维码关注公众号,回复: 12925848 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_44918090/article/details/115231037