问题 C: 数列计算I(点击)
时间限制: 1 Sec 内存限制: 128 MB
提交: 496 解决: 250
[提交] [状态] [讨论版] [命题人:admin]
题目描述
有一列数是:4/7, 7/11, 11/18, 18/29, 29/47, 47/76 „„请找出这个数列的规律,编写程序计算并输出这个数列的第 N 项(要求是分数形式),并计算这个数列的前 N 项和(结果四舍五入保留两位小数)。(其中:3≤N≤30)。
输入
只有一行,包含1个符合题目要求的正整数N。
输出
共有两行。
第一行如样例中的一个特定格式的分数表示这个数列的第N项;
第二行仅包含一个数表示这个数列的前N项的和。
样例输入
复制样例数据
6
样例输出
47/76
3.68
思路:
主要是四舍五入问题 当时编译器还有问题 刚才才刚刚发现 明明强制转换了变四舍五入 运行后还是错误的答案 但是提交了就正确
浪费了不少时间。
代码:
#include<stdio.h>
int main()
{
int a[35],i,n;
double sum[35];
a[1]=4,a[2]=7;
for(i=3;i<=31;i++){
a[i]=a[i-1]+a[i-2]; //打表把每个分数的分子保存进数组 其实还可以更简单:将分母保
} //存下来每次都直接计算sum 但是开始没想起来 就在下面多加了个
sum[1]=4.0/7.0; //for循环
for(i=2;i<=30;i++){
sum[i]=sum[i-1]+(a[i]/(a[i+1]*1.0));
}
scanf("%d",&n);
printf("%d/%d
",a[n],a[n+1]);
printf("%.2lf
",(int)(sum[n]*100+0.5)/100.0); //四舍五入方法(小数位)
return 0;
}
方法总结:
1.不保留小数的四舍五入:
加头文件:#include<math.h>
int a=round(a1) //a代表转换后的值 a1代表转换前的浮点型数
2.保留一位小数的四舍五入:
a=(int)(a1*10+0.5)/10.0; //a 和a1 的含义同上
3.保留两位小数的四舍五入:
a=(int)(a1*100+0.5)/100.0; //a 和a1 的含义同上
注意:最后所除的一定是浮点型的10.0 和100.0 不然就会错误
其他小数点后位数的转换可以以此类推
测试:
#include<stdio.h>
#include<math.h>
int main()
{
double a1=1.5,a2=1.44,b1=1.44,b2=1.46,c1=1.445,c2=1.444;
int a11=round(a1);
int a12=round(a2);
double b11=(int)(b1*10+0.5)/10.0;
double b12=(int)(b2*10+0.5)/10.0;
double c11=(int)(c1*100+0.5)/100.0;
double c12=(int)(c2*100+0.5)/100.0;
printf("%d %d %.1lf %.1lf %.2lf %.2lf
",a11,a12,b11,b12,c11,c12);
return 0;
}