超星高级语言程序设计实验作业
实验02 分支与循环程序设计(三)
注:以下内容仅供交流,代码都是本人自己写的,还请同学们先自己编写再进行交流。
11.勒让德多项式
题目描述:编一个程序,输入x、n,计算勒让德(Legendre)多项式的第 n 项。
输入:一个浮点数和一个整数,分别对应x和n(0<=n<=20)。
输出:一个浮点数,即勒让德多项式第n项的值,注意小数点后保留到第2位。
样例1:
输入:3.4 2
输出:16.84
样例2:
输入:3.4 10
输出:30143685.82
样例3:
输入:3.4 21
输出:23525972077722828.00
#include<stdio.h>
double lr(int n, double x) {
double p=0, p1, p2;
int k;
if (n == 0) p = 1;
else if (n == 1) p=x;
else{
p2 = x; p1 = 1;
for (k = 2; k <= n; k++){
p = ((2 * k - 1) / (double)k) * x * p2 - ((k - 1) / (double)k) * p1;
p1 = p2;
p2 = p;
}
}
return p;
}
int main() {
double x,sum=0;
int n;
scanf_s("%lf %d", &x, &n);
sum = lr(n, x);
printf("%.2lf", sum);
return 0;
}
这道题MOOC上也有,但是它们不一样😭
有很多小伙伴 (包括我) 在这道题上卡了很长时间,用头发😅总结出来超星上大部分的浮点型都是用double类型,用float精度不够最后几位会不一样😱
这道题代码可以用来过OJ但是最后一个样例结果不太一样。😣还要修改
12.数字金字塔
题目描述:编程序,制打印如下所示的n行数字金字塔(n由用户从键盘输入)。
1 2 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 2 1
输入:一个正整数 n (≤10).
输出:如上所示的类似数字金字塔。输出由数字 0~9构成的n行数字三角矩阵:其中第一行有1个数,第二行有3个数,依次类推,每个数字占用2位英文字符宽度,宽度不足2位的的在数字左侧补空格;整个数字三角阵,除必要的空格、数字、回车换行符,无多余字符。
样例1:
输入:1
输出:
1
样例2:
输入:3
输出:
1
1 2 1
1 2 3 2 1
#include<stdio.h>
int outl(int n) {
int i;
for ( i = 1; i < n; i++){
printf("%2d", i);
}
if (n == 10) printf(" 0");
else printf("%2d",n);
for (i=i-1; i >0; i--){
printf("%2d", i);
}
return 0;
}
int kongg(int n,int i) {
int k;
for ( k=1;k <= (n-i) ; k++){
printf(" ");
}
return 0;
}
int main() {
int n,i;
int out;
scanf_s("%d", &n);
for ( i = 1; i <=n; i++){
out = kongg(n, i);
out = outl(i);
if (i < n) printf("\n");
}
return 0;
}
题目要求是最中间的列对齐。
13.计算 e^x
题目描述:请计算上述序列前100项的和
输入:一个浮点数,对应x值。
输出:一个浮点数,即e^x的近似值,小数点后保留到第2位。
注:本题不允许使用math.h头文件和相关的pow和exp等函数。
样例1:
输入:0
输出:1.00
样例2:
输入:4.3
输出:73.70
#include<stdio.h>
float gx(float x, int n) {
int i; float sum=1;
for ( i = 1; i <= n; i++){
sum = sum * x / i;
}
return sum;
}
int main() {
float x,m=0,out=0;
scanf_s("%f", &x);
for (size_t i = 0; i <= 100; i++){
m = gx(x, i);
out = out + m;
}
printf("%.2f", out);
return 0;
}
唯一要注意的就是不能用math.h
14.公式累乘
题目描述:用如下的展开式计算当n为某给定值时,圆周率π的值。
输入:一个正整数n (n<100000)
输出:一个浮点数,保留小数点后10位。
样例1:
输入:1000
输出:3.1408077460
样例2:
输入:10000
输出:3.1415141187
#include<stdio.h>
double gx(double i) {
double jieg;
jieg = 4 * i * i / (2 * i - 1) / (2 * i + 1);
return jieg;
}
int main() {
int n,i;
double sum;
scanf_s("%d", &n);
sum = 2;
for ( i = 1; i <= n; i++){
sum = sum * gx(i);
}
printf("%.10lf", sum);
return 0;
}
15.公式累加
题目描述:用如下的展开式计算当n为某给定值时,sh(x)的值。
Exp02-Enhance03.jpg
编写程序,对上面的公式读入x,输出序列的和直到尾项 小于10^-5。
输入:一个浮点数作为x的值
输出:一个浮点数,保留小数点后6位。
样例1:
输入:1
输出:1.175198
样例2:
输入:1.5
输出:2.129277
#include<stdio.h>
#include<math.h>
double fm( double x, double n) {
double sum=1;
int i;
for (i=1;i<=2*n+1; i++){
sum = sum * x / i;
}
return sum;
}
int main() {
double out, m;
double x;
int i = 1;
scanf_s("%lf", &x);
out = 0; m = x;
for (i = 1;fabs(m)>=1e-5; i++){
out = out + m;
m = fm(x, i);
}
printf("%.6lf", out);
return 0;
}
这道题啊,卡了一个星期测试的时候结果跟给的样例一样,但是提交后是有两个通过三个不通过,我想了一个星期都没事想出来,最后问了老师
我 犯 了 个 低 级 的 错 误
for (i = 1;fabs(m)>=1e-5; i++)
这句中是判断最后一项是否小于10^-5,应该写成1e-5结果我写成10e-5了😭,还有最后一项的值m可能小于0,因此要写绝对值
希望年轻人耗子尾汁,不要犯我这样的错误。😬