《算法笔记》——基础篇习题循环结构
循环结构
第二章 C/C++快速入门——2.4循环结构
【习题G】 一元二次方程求根
Problem Description
用如下公式
求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。
要求输出的结果总宽度占10位,其中小数部分为8位。
程序中使用浮点型数据时,请定义为双精度double类型。
如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).
Input
无
Output
PI=圆周率的近似值
输出的结果总宽度占10位,其中小数部分为8位。
末尾输出换行。
Sample Input
无
Sample Output
PI=3.14159065
Thinking Notes
- for循环第二个式子为空相当于while(1),无条件循环,和break配合实现循环退出
- 找数列规律【1,1/3,1/5】——1/(2*i-1)
- pow函数求幂,控制加减跳变
- 科学计数法106——1e-6
- 注意整形变量i和double型运算时的类型强制性转换
- pow函数的两个参数都是double型,(i-1)作为参数要乘一个1.0转换类型
Code Implementation(C)
#include<stdio.h>
#include<math.h>
int main(){
double pi=0;
for(int i=1;;i++){
if(1/(2.0*i-1)<1e-6) break;
pi+=1/(2.0*i-1)*pow(-1.0,1.0*(i-1));
}
printf("PI=%10.8f\n",4*pi);
return 0;
}
【习题H】 Fibonacci数列
Problem Description
输入一个正整数n,求Fibonacci数列的第n个数。Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
要求输入的正整数n不超过50.
Input
一个不超过50的正整数
Output
Fibonacci数列的第n个数,末尾输出换行。
Sample Input
20
Sample Output
6765
Thinking Notes
没到用递归的程度,求每一项需要之前两项,用数组存储
Code Implementation(C)
自己写的
#include<stdio.h>
int main(){
int n,f[50];
scanf("%d",&n);
f[0]=1;
f[1]=1;
for(int i=2;i<=n;i++){
f[i]=f[i-1]+f[i-2];
}
printf("%d\n",f[n-1]);
return 0;
}
或 看看大佬
#include <cstdio>
long long dp[50];
int main()
{
dp[0]=dp[1]=1;
for(int i=2;i<=50;++i)
dp[i]=dp[i-1]+dp[i-2];
int a;
scanf("%d",&a);
printf("%lld\n",dp[a-1]);
return 0;
}
【习题I】分数序列求和
Problem Description
有如下分数序列
求出次数列的前20项之和。
请将结果的数据类型定义为double类型。
Input
无
Output
小数点后保留6位小数,末尾输出换行。
Sample Input
无
Sample Output
32.660261
Thinking Notes
找规律
Code Implementation(C)
#include<stdio.h>
int main(){
double sum;
double z=2.0,m=1.0,mt;
for(int i=1;i<=20;i++){
sum+=z/m;
mt=m;
m=z;
z=z+mt;
}
printf("%.6f\n",sum);
return 0;
}