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;
}