STD高级语言程序设计第五天

 7-1 平原作战 (10 分)

我军在平原地带与敌人遭遇,我炮兵瞄准敌人开炮射击。

请编写程序,输入炮弹的初速度 v0​ 和射程 x,输出炮弹的射角 α。

输入格式

初速度 v (米/秒)
射程 x (米)

输出格式

射角 α (度、分和秒数)

要求:射角不小于45度。秒数输出2位小数,末尾4舍5入。

输入样例

760.8
48631.53

结尾无空行

输出样例

62 17 14.81

结尾无空行

注:重力加速度 g = 9.8,圆周率 π = 3.1415926535897932384626...

#include<stdio.h>
#include<math.h>
int main()
{
    //接收速度和位移
    double v,x;
    scanf("%lf%lf",&v,&x);
    
    //定义重力加速度,赋初值9.8
    double g=9.8;
    
    //定义圆周率,并赋初值
    double Pi=3.1415926535897932384626;
    
    //v*sin_a/g=t
    //v*cos_a*t=x/2
    //sin_2a=g*x/v/v
    double s=g*x/v/v;
    
    //利用反三角函数,求出此时的弧度
    double as=asin(s);
    
    //此时的弧度是二倍的阿尔法,所以要除以2
    as/=2;
    
    //将弧度转化为角度
    as=as*180/Pi;
    
    
    as=90-as;
    
    //强制类型转换,舍弃as后面的小数部分
    int du=(int)as;
    
    //将度数的整数部分减去乘以60,并强制类型转换,舍弃小数部分
    //时间的进制为60,所以要乘以60
    int fen=(int)((as-du)*60);
    
    //将度数的整数部分及分的部分减去,乘以60就是秒的部分
    double miao=((as-du)*60-fen)*60;
    
    //输出
    printf("%d %d %.2lf",du,fen,miao);
    
    return 0;
}

 7-2 找成绩 (10 分)

给定n个同学的m门课程成绩,要求找出总分排列第k名(保证没有相同总分)的同学,并依次输出该同学的m门课程的成绩。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试包含两部分,第一行输入3个整数n、m和k(2≤n≤10,3≤m≤5,1≤k≤n);接下来的n行,每行输入m个百分制成绩。

输出格式:

对于每组测试,依次输出总分排列第k的那位同学的m门课程的成绩,每两个数据之间留一空格。

输入样例:

1
7 4 3
74 63 71 90
98 68 83 62
90 55 93 95
68 64 93 94
67 76 90 83
56 51 87 88
62 58 60 81

输出样例:

67 76 90 83

 

#include<stdio.h>
int main()
{
    //接收输入的组数
    int a;
    scanf("%d",&a);
    
    //输入每组的数据
    for(int x=0;x<a;x++)
    {
        //输入同学人数,课程总数,及输出的排名
        int n,m,k;
        scanf("%d %d %d",&n,&m,&k);
        
        //输入每名同学的每门课程的分数
        //b数组与c数组的角标相互对应
        //b数组用来存储每名同学的总成绩
        //双层循环
        //外面的大循环控制学生人数
        //里面的小循环控制每名学生每门的成绩
        int b[10]={0},c[10][5];
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                //输入每门成绩
                scanf("%d",&c[i][j]);
                
                //计算总成绩
                b[i]+=c[i][j];
            }
        
        //冒泡法排序
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
                if(b[i]<=b[j])
                {
                    //交换总成绩
                    int temp;
                    temp=b[i];
                    b[i]=b[j];
                    b[j]=temp;
                    
                    //因为b的角标与c的角标相互对应
                    //所以c数组也要换
                    //因为数组c存储的是每门课程的成绩
                    //每门课程的成绩都要换
                    //所以利用循环进行换成绩
                    for(int k=0;k<m;k++)
                    {
                        temp=c[i][k];
                        c[i][k]=c[j][k];
                        c[j][k]=temp;
                    }
                }
        
        //输出排名为k的成绩,只输出到倒数第二门课的成绩
        //最后一门课后面不能存在空格,单独输出
        for(int i=0;i<m-1;i++)
            printf("%d ",c[k-1][i]);
        
        //单独输出最后一门成绩
        printf("%d",c[k-1][m-1]);
        
        //换行一定要存在,多组数据会按行打印
        //本题测试用例只有一组数据,具有一定迷惑性
        printf("\n");
    }
    
    return 0;
}

 7-4 验证“哥德巴赫猜想” (20 分)

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:

输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

结尾无空行

输出样例:

24 = 5 + 19

结尾无空行

 

#include<stdio.h>
#include<math.h>

//判断是不是素数,是的话返回1,不是返回0
int isprime(int x);

int main()
{
    //输入一个“哥德巴赫猜想”数
    int a;
    scanf("%d",&a);
    
    //判断a-2是否为素数,如果是,输出,程序结束
    if(isprime(a-2))
    {
        printf("%d = %d + %d\n",a,2,a-2);
        return 0;
    }
    
    //i从3开始,偶数必不为素数,所以i每次+2,这样能够提高计算机一倍的运行速度
    //i的最大值为a/2
    for(int i=3;i<=a/2;i+=2)
    {
        //原来小编是用一个循环将j从a-2开始,先计算是不是素数,在计算i+j是不是为a
        //这样的运行速度很慢
        //现在可直接定义j等于a-i,判断j是不是素数
        //如果是素数,输出,程序结束
        //不是,循环体进行下一次计算
        int j=a-i;
        if(isprime(i)&&isprime(j))
        {
            printf("%d = %d + %d\n",a,i,j);
            return 0;
        }
    }
}

int isprime(int x)
{
    //x是3,5,7直接将函数的返回值返回1
    if(x==3||x==5||x==7)
        return 1;
    
    //如果不是,从3开始,每次加2
    //因为偶数必不为素数,除了2,这样也能提高运行速度
    for(int i=3;i<=sqrt(x);i+=2)
        //如果能整除,函数直接返回0
        if(x%i==0)
            return 0;
    
    //如果程序能执行到这里,说明不能被整除
    //该数为素数,返回1
    return 1;
}

 这是小编最开始写的代码,虽然比上面的要简短一些,但是运行速度要比上面的代码慢上一些

#include<stdio.h>
#include<math.h>
int prime(int x);
int main()
{
    int a;
    scanf("%d",&a);
    for(int i=2;i<=a/2;i++)
    {
        int j=a-i;
        if(prime(i)&&prime(j))
        {
            printf("%d = %d + %d\n",a,i,j);
            return 0;
        }
    }
}

int prime(int x)
{
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0)
            return 0;
    return 1;
}

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值