本文主要是介绍湖南中医药大学OJ—1180到1189,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1180: 习题5-7 求和
- 1181: 习题5-8 求水仙花数
- 1182: 习题5-9 完数
- 1183: 习题5-10 分数序列求和
- 1184: 习题5-11 求多次落地弹球高度
- 1185: 习题5-12 猴子吃桃问题
- 1186: 习题5-13 迭代法求平方根
- 1187: 习题5-14 牛顿迭代法求方程的根
- 1188: 习题5-15 二分法求方程的根
- 1189: 习题6-1 筛选法求素数
1180: 习题5-7 求和
题目描述
求如下式子的和
请将结果定义为double类型。
注意求平方,不要用C数学库中提供的函数pow。
输入
无
输出
小数点后保留6位小数,末尾换行。
样例输入 Copy
无
样例输出 Copy
47977.928968
根据算式利用for循环AC
#include<stdio.h>
int main()
{int k,i,j;double a,d,b=0,c=0;for(j=1;j<=100;j++){b+=j;}for(i=1;i<=50;i++){a=i*i;b+=a;}for(k=1;k<=10;k++){d=1.0/k;b+=d;}printf("%lf\n",b);return 0;
}
1181: 习题5-8 求水仙花数
题目描述
输出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。
例如,153是一个水仙花数,因为153=13+53+33
输入
无
输出
每行输出一个水仙花数。
样例输入 Copy
无
样例输出 Copy
153
370
371
407
首先得到这个数的每一个位数的数值,在加起来验证是否等于这个数本身
#include<stdio.h>
#include<math.h>
int main()
{int a,b,c,n;for(n=100;n<1000;n++){a=n/100;b=n/10%10;c=n%10;if(pow(a,3)+pow(b,3)+pow(c,3)==n){printf("%d\n",n);}}return 0;
}
1182: 习题5-9 完数
题目描述
一个数如果恰好等于它的因子和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,所以6是“完数”。
编程输出1000以内的所有完数,每个完数输出一行,并按下面的格式输出其因子:
6 its factors are 1,2,3
输入
无
输出
每个完数输出一行,并按下面的格式输出其因子:
? its factors are ?,?,?
样例输入 Copy
无
样例输出 Copy
6 its factors are 1,2,3
28 its factors are 1,2,4,7,14
496 its factors are 1,2,4,8,16,31,62,124,248
提示
因子包含1但不包含其本身。
首先是我记得当初这个输出格式把我搞得快疯了,然后这道题,先判断出这个数是否满足有因数之和等于他的条件,如果满足就先吧这个数搞出来,在逐个输出他的因数就好了,然后继续判断下一个数。
#include<stdio.h>
int main()
{int i,j,k;for(i=1;i<1000;i++){int sum=0;for(j=1;j<i;j++){if(i%j==0){sum+=j;}}if(sum==i){printf("%d its factors are ",i );for(k=1;k<i;k++){if(i%k==0){printf("%d",k);if(k<i/2)printf(",");}}printf("\n");}}return 0;
}
1183: 习题5-10 分数序列求和
题目描述
有如下分数序列
求出次数列的前20项之和。
请将结果的数据类型定义为double类型。
输入
无
输出
小数点后保留6位小数,末尾输出换行。
样例输入 Copy
无
样例输出 Copy
32.660261
将分子和分母分开算,数值增加都有规律,再则就是注意for里面的逻辑顺序
#include<stdio.h>
int main()
{int i=2,j=1,a,k;double m,n=0;for(k=0;k<20;k++){a=i;m=i*1.0/j;i=i+j;j=a;n+=m;}printf("%lf\n",n); return 0;
}
1184: 习题5-11 求多次落地弹球高度
题目描述
一个球从100m的高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。
求它从第一次落地时,到第N次落地时,共经过了多少米,第N次反弹多高。
输入
一个正整数N,表示球落地的次数。
输出
length=球第N次落地时所经过了距离
high=球第N次落地反弹的高度
小数点后保留4位小数。
注意:末尾输出换行。
样例输入 Copy
10
样例输出 Copy
length=199.8047
high=0.0977
计算每次的高度和下次到达的高度,再加起来
#include<stdio.h>
int main()
{int n,i;float length=100,high=100;scanf("%d",&n);for(i=0;i<n-1;i++){high=high*1.0/2;length+=high;}high=high*1.0/2;printf("length=%.4f\nhigh=%.4f\n",length,high);return 0;
}
1185: 习题5-12 猴子吃桃问题
题目描述
猴子第1填摘下若干桃子,当即吃了一半,还觉着不过瘾,又多吃了一个。第2天早晨,又将剩下的桃子吃掉一半,又多吃了一个。以后每天早晨都吃了前一天剩下的一半零一个。到第10天早上想再吃时,发现就只剩一个桃子了。求第1天共摘了多少个桃子。
输入
无
输出
一个整数,末尾换行。
样例输入 Copy
无
样例输出 Copy
1534
逆向分析一下,做个加法,首先是第一天只有一个果子,后面根具规则,每天多一个在两倍,算出十天的,就是总数
#include<stdio.h>
int main()
{int n=1,i,x=0;for(i=0;i<9;i++){n=(n+1)*2;}printf("%d",n);return 0;
}
1186: 习题5-13 迭代法求平方根
题目描述
输入一个非负实数a,用迭代法求平方根
求平方根的迭代公式为
要求前后两次求出的x的差的绝对值小于10-5
从键盘输入非负实数a和迭代初值x0,输出满足条件的xn+1
C数学库中有求绝对值的函数fabs.
输入
非负实数a和迭代初值x0(要求double类型)
输出
输入非负实数的平方根,保留6位小数,末尾换行。
样例输入 Copy
10 3
样例输出 Copy
3.162278
数学公式就直接带入变量计算就可以了
#include<stdio.h>
#include<math.h>
int main()
{double a,x0,x1;scanf("%lf %lf",&a,&x0);x1=(x0+a/x0)/2;if(fabs(x1-x0)>=pow(10,-5))//fabs就是一个求绝对值得函数{x0=x1;x1=(x0+a/x0)/2; }printf("%.6lf\n",(x1+a/x1)/2);///用do~while可以直接输出x1return 0;
}
1187: 习题5-14 牛顿迭代法求方程的根
题目描述
用牛顿迭代法求下面方程在输入初值点附近的根:
2x3-4x2+3x-6=0
要求前后两次求出的x的差的绝对值小于10-6
牛顿迭代法公式如下:
将给定给定方程写成f(x)=0的形式,在给定初值x0的情况下,按如下公式迭代计算:
xn+1=xn-f(x)/f’(x)
提示:C语言数学库中有求指数an的函数pow(a, n)以及求x绝对值的函数fabs(x)
浮点型数据请定义为双精度double类型。
输入
双精度浮点型初值x0
输出
x0附件方程的根,小数点后保留6位小数,末尾换行。
样例输入 Copy
3
样例输出 Copy
2.000000
和上面的题道理是一样的,都是将变量带入公式中进行计算,这个牛顿迭代法可以查一下资料,后面有一门数值计算会有许多计算方法,包括后面的二分法求根,可以提前学习
#include<stdio.h>///x(n+1)=x(n)-f(x(n))/f'(x(n))
#include<math.h>
int main()
{double x0,m,n,x1;scanf("%lf",&x0);//s=(2*pow(x0,3)-4*pow(x0,2)+3*x0-6)/(6*pow(x0,2)-8*x0+3);//x1=x0-s;if(fabs(x1-x0)>=pow(10,-6)){x0=x1;m=(2*pow(x0,3)-4*pow(x0,2)+3*x0-6);n=(6*pow(x0,2)-8*x0+3);x1=x0-m/n;}printf("%.6lf\n",x1);return 0;
}
1188: 习题5-15 二分法求方程的根
题目描述
用二分法求下面方程在区间(a,b)之间的根:
2x3-4x2+3x-6=0
区间端点a, b由键盘输入,确保输入区间内有根。
计算至误差小于10-6为止。
程序中,浮点型数据请定义为双精度double类型。
提示:二分法求方程根的步骤如下:
先将方程写成f(x)=0的形式,再按照如下步骤计算:
1.求出给出的两个端点之间的值fx1,fx2.当fx1fx2<0,则表明x1和x2之间必存在一根
要么就不存在,一直提示输出x1和x2.
2.一旦fx1fx2<0,就表明在x1和x2之间有根,继续判断,求的x1和x2的中点值x0,求出fx0.
3.在判断fx0*fx1>0,则在x0和x2中间去找根,此时x1不起作用,用x0代替x1,用fx0代替fx1.
要么就在x0和x1中去找根,此时x2不起作用,用x0代替x2,用fx0代替fx2.
输入
以空格分隔的区间端点值,确保输入的区间内存在方程的根。
输出
二分法求得的方程根,小数点后保留6位小数,末尾换行。
样例输入 Copy
-10 10
样例输出 Copy
2.000000
原理题目已经说得很清楚了,有点繁杂,仔细审题
#include<stdio.h>
#include<math.h>
double val(double x)
{double y;y=2*pow(x,3)-4*pow(x,2)+3*x-6;return y;
}
int main()
{double a,b,c;scanf("%lf %lf",&a,&b);if(val(a)==0){printf("%lf\n",a);}if(val(b)==0){printf("%lf\n",b);}while(val(a)*val(b)<0){c=(a+b)*1.0/2;if(val(a)*val(c)<0){b=c;}if(val(b)*val(c)<0){a=c;}if(val(c)==0||fabs(a-b)<pow(10,-6)){printf("%lf\n",c);break;}}return 0;
}
1189: 习题6-1 筛选法求素数
题目描述
从键盘上输入一个正整数N(N<=100),用筛选法求N之内的素数
输入
正整数N
输出
0~N之间的素数,每个素数一行
样例输入 Copy
100
样例输出 Copy
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
提示
筛选法求N以内的素数
算法:
(1)挖去1;
(2)用下一个未被挖去的数P去除P后面各数,把P的倍数挖掉;
(3)检查P是否小于N的开方的整数部分,如果是,则返回2继续执行,否则就结束。
(4)剩下的数就是素数。
我承认我懒了,没看程序了,解析无o(´^`)o
#include<stdio.h>
#include<math.h>
int main()
{int n,p,i,x,a[105];scanf("%d",&n);x=sqrt(n);for(p=1;p<=n;p++)a[p]=p;a[1]=0;for(p=2;p<=x;p++){for(i=p+1;i<=n;i++){if(a[p]!=0&&a[i]!=0){if(a[i]%a[p]==0)a[i]=0;}}}for(p=1;p<=n;p++){if(a[p]!=0)printf("%d\n",a[p]);}return 0;
}
这篇关于湖南中医药大学OJ—1180到1189的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!