直扣题意暴力解法
1.近似值
【问题描述】
已知可以用下列公式计算π的近似值。给定一个π的近似值e,编程利用下列公式求得最接近e的近似值π,以及迭代次数n(大于等于1)。
π/2 = (2/1 x 2/3) x (4/3 x 4/5) x (6/5 x 6/7) x … x [2n/(2n-1)x2n/(2n+1)]
【输入形式】
从控制台输入e( e大于2.6666667,小于3.14159)的值。
【输出形式】
输出最接近e的近似值π,以及迭代次数n(以一个空格分隔,并且输出π时要求小数点后保留9位有效数字)。
【样例输入1】3.1201
【样例输出1】3.120149087 36
【样例1说明】
输入的π的近似值e为3.1201,当n为35时计算的π值为3.119547206,与给定e值之差的绝对值为0.000552794。当n为36时,计算的π值为3.120149087,与给定e值之差的绝对值为0.000049087,可以看出n为36时比n为35时求得的π值更接近给定的e值。并且n为36时求得的π值已经大于给定的e值,当n继续增大时,求得的π值将递增,所以利用上述计算公式求得的最接近e的近似值为3.120149087,对应的迭代次数为36。
这类题很明显只要跟着题意往下做即可,只需观察题意中数据的规律,利用数学规律解题,只要保证条件不混肴,想清楚再动手,多训练几题就熟能生巧了。(注意数据输入与输出的类型)
#include<stdio.h>
int main()
{
double n = 1;
double e = 0, sum = 1, temp = 1;//观察题目关于Π为因变量关于n的函数是增函数
scanf("%lf", &e);
while (e - 2 * sum >= 0)
{
temp = sum;
sum *= 4 * n * n / (4 * n * n - 1);
n++;
}
if (2 * sum - e > e - 2 * temp)
printf("%.9lf %.0lf", 2 * temp, n - 2);
else
printf("%.9lf %.0lf", 2 * sum, --n);
return 0;
}
- 迭乘式
对于迭乘类题目切忌数据溢出,若有过大的数值计算最好不用自建迭乘子函数,实在过大用 long long 类型或者double 类型存放。
- 类似斐波那契数列的基础题
/ 与 % 的多样用法
用 / 与%将不同位数的数字分离
1.水仙数
比较经典基础的应该是水仙数
一个三位的十进制整数,如果它的三个数位的数字立方和等于这个数的数值,则称它为一个“水仙数”
【输入形式】
从控制台输入两个整数(以空格分割),分别表示数据范围的下限m和上限n,且满足0<=m<=n<=10000。
【输出形式】
向控制台输出在该数据范围内(包括数据的上下限)的所有“水仙数”,以从小到大的顺序显示在一行上,各数之间以空格分割。
【样例输入1】50 370
【样例输出1】 153 370
【样例1说明】
输入的数据范围下限为50,上限为370。因为要求水仙数为三位数,所以实际上就是求100~370之间的 水仙数,由于13 + 53 + 33 = 153,33 + 73 + 03 = 370,因此该范围内的水仙数为153和370(包括上限370)。
#include<stdio.h>
int main()
{
int m, n,num=0;
scanf("%d%d", &m, &n);
int sum = 0,temp;
for (; m <= n; m++)
{
num = m;
sum = 0;
temp = 10000;
while (temp >=10)
{
temp /= 10;
sum += num / temp * (num / temp )*( num / temp);//记得括号
num -= num / temp * temp;
}
if (sum == m)
printf("%d ", m);//若要严谨空格输入输出用数组存放数据再输出
}
return 0;
}