题目一:
该题目方法很多,乍一看这题目让人头皮发麻。其实,如果我们可以转换一下,这道题目就很简单。我们可以从最后一项开始往前推,通过循环得到我们想要的答案。
方法一:使用循环解决
代码设计注意:
①函数库的调用
②注意数据发生截断。double—float—int
#include<stdio.h>
#include<math.h>
double jisuan(double x, int n) //主体实现
{
double y = sqrt(1 + x);
for (int i = 2; i <= n; i++)
{
y = sqrt(y + i);
}
return y;
}
int main()
{
double x = 0;
int n = 0;
scanf("%lf %d", &x, &n);
double y = jisuan(x, n);//设计函数
printf("%.2lf", y);
return 0;
}
方法二:通过递归解决
利用函数递归解决主要注意“墙”的设立,即终止条件
double jisuan(double x, int n) //只需改动函数
{
if (n == 1)
return sqrt(x + 1);
else
{
return sqrt(n + jisuan(x, n - 1));
}
}
题目二:
笔者在拿到题目时,将题目理解错误,“输出最长平台的长度”误认为“输出最长平台对应的值”,导致原地绕圈。本题目设计需要利用到数组和两值交换。设计时尤其注意数组大小防止越界。
代码为:
#include<stdio.h>
int Max(int arr[], int n)
{
int len = 1;
int max = 0;
int temp = 0;
if (n == 1)
return 1;
for (int i = 0; i < n ; i++)
{
if (arr[i] == arr[i + 1])
len++;
else
{
if (len > max)
{
max = len;
len = 1; //重置长度
}
}
}
return max;
}
int main()
{
int n;
int arr[101]={0}; //函数中比较存在arr【i】和arr【i+1】,防止越界
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
int put = Max(arr, n);
printf("%d", put);
return 0;
}
今天水了两道题,通过不断调试,敲代码学习,对该部分知识又一次认识。
- 函数递归中“墙”的设立,防止递归陷入死循环。典例斐波那契数列
- 数组越界: 并不会报错,但存在一个隐患,可能某一次就会使程序崩溃。
- 数据截断: 在函数使用的时候,main主体和函数内类型不同时会发生数据截断,保存成同类型,会发生截断。与此,也会有数据扩展,需要将数据扩展成字符数更长的数据的时候,一般低位都保持不变,继续保留原有的数据,多出的高字节数据,需要根据当前被扩展数据进行不同的填充。
读者有更好的建议,不同的代码对知识不同的理解,欢迎大家留言!