湖南中医药大学OJ—1180到1189

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可以直接输出x1
    return 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.一旦fx1
fx2<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;
}

猜你喜欢

转载自blog.csdn.net/qq_43337254/article/details/109697769