7-1 求玉米亩产量
如图,有一块玉米地,位于一条东西向公路的北侧,南北向公路的东侧。第一个顶点距离南北路750米,东西路550米;第二个顶点距离南北路850米,东西路50米;第三个顶点距离南北路50米,东西路250;第四个顶点距离南北路150米,东西路450米。该块地种植玉米,收获的总产量为120吨,求玉米每亩产量为多少千克?要求编写程序求解该问题。
编程要求:
程序中至少要有两个函数,函数的功能如下:
(1)编写函数计算两点之间的距离,从而算术图中四边形的四个边的长度以及一个对角线的长的;
(2)根据海伦公式编写一个计算三角向面积的函数;说明
1平方米=0.0015亩
输入格式:
一行中输入8个实数,每个数之间用空格隔开。从左到右每两个一组,每组表示一个点的横坐标和纵坐标。
输出格式:
输出一个实数,表示玉米的亩产量。输出保留2位小数。
输入样例:
750 550 850 50 50 250 150 450
输出样例:
326.53
代码如下:
#include <stdio.h> #include <math.h> double Area(double a,double b,double c) { double p = (a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } double lenth(double xa,double xb,double ya,double yb) { return sqrt(pow(xb - xa, 2) + pow(yb - ya, 2)); } int main (){ double xa,ya,xb,yb,xc,yc,xd,yd; scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&xa,&ya,&xb,&yb,&xc,&yc,&xd,&yd); double AB,BC,CD,DA,BD; double area1,area2; AB = lenth(xa,xb,ya,yb); BC = lenth(xb,xc,yb,yc); CD = lenth(xc,xd,yc,yd); DA = lenth(xd,xa,yd,ya); BD = lenth(xb,xd,yb,yd); area1 = Area(AB,BD,DA); area2 = Area(BC,CD,BD); double sum = 0; sum = (area1+area2)*0.0015; printf("%.2f",120000/sum); }
7-2 判断给定整数是否素数[加强版]
素数是指在大于
1
的自然数中,除了1
和它本身以外,不能被其他自然数整除的数。本题要求编写程序,判断从键盘输入的数是否素数。如果是素数,输出XX is prime number.
的信息,否则,输出XX is not prime number.
的信息。编写程序要求:
编写一个函数IsPrime()来判断素数。如果是素数,函数的返回值就是该数,否则函数的返回值为0.
输入格式:
在一行中输入一个非负整数.
输出格式:
在一行输出
XX is prime number.
或者XX is not prime number.
的信息。输入样例1:
5
输出样例1:
5 is prime number.
输入样例2:
121
输出样例2:
121 is not prime number.
代码如下:
#include <stdio.h> #include <math.h> int main() { int n; scanf("%d", &n); if (isPrime(n)==n) { printf("%d is prime number.", n); } else { printf("%d is not prime number.", n); } return 0; } int isPrime(int n) { if (n ==0 ||n == 1) { return 0; } for (int i = 2; i<=(int)sqrt(n); i++) { if (n % i == 0) { return 0; } } return n; } //第二种方案 #include <stdio.h> #include <math.h> int isPrime(int n); int main() { int n; scanf("%d", &n); if (isPrime(n)==n) { printf("%d is prime number.", n); } else { printf("%d is not prime number.", n); } return 0; } int isPrime(int n) { if (n <= 1) { return 0; } if (n <= 3) { return 1; } if (n % 2 == 0 || n % 3 == 0) { return 0; } for (int i = 5; i * i <= n; i += 6) { if (n % i == 0 || n % (i + 2) == 0) { return 0; } } return 1; }
7-3 今天后的第n天是星期几
从键盘上输入今天是星期几,和一个数字n,计算今天后第n天是星期几。n可以是负值,当n是负值时表示的是今天之前的第n天。
输入格式:
从键盘上输入两个整数,两个整数之间用空格间隔。第一个整数表示今天是星期几,第二个整数表示n天后,n可以为负,负数表示n天前。
输出格式:
输出一个1到7之间的整数,
7
表示星期天,1
表示星期一,...... ,6
表示星期六。输入样例1:
3 2
输出样例1:
5
输入样例2:
3 4
输出样例2:
7
代码如下:
#include <stdio.h> #include <math.h> int main (){ int m , n; int ret = 0; ret = (abs(m+n)%7); scanf("%d %d",&m,&n); if (n==0) { printf("%d",m); } else if(n>0) { if( m+n == 7) { printf("7"); }else if(m+n<7) { printf("%d",m+n); } else { printf ("%d",ret); } } else { printf("%d",7-ret); } return 0; }
7-4 猜数字
一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。
输入格式:
输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。
输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
输入样例:
7 Bob 35 Amy 28 James 98 Alice 11 Jack 45 Smith 33 Chris 62
输出样例:
22 Amy
代码如下
#include <stdio.h> struct student { char name[20]; int num; }stu [10000]; int main () { int i,j,n,temp1,temp2 ; int sum , avg,tar; scanf("%d",&n); for ( i = 0;i<n;++i) { scanf("%s %d",&stu[i].name,&stu[i].num); } for(sum = 0,i = 0;i<n;++i ) { sum += stu[i].num; avg = sum/(2*n); } tar = 0; temp1 = stu[0].num-avg; if(temp1<0) { temp1 = temp1*-1; } for(i = 1;i<n;++i) { temp2 = stu[i].num - avg; if(temp2<0) { temp2 = -1*temp2; } if(temp1>temp2) { temp1 = temp2; tar = i; } } printf("%d %s",avg,stu[tar].name); }
7-5 N个数求和
本题的要求很简单,就是求
N
个数字的和。麻烦的是,这些数字是以有理数分子/分母
的形式给出的,你输出的和也必须是有理数的形式。输入格式:
输入第一行给出一个正整数
N
(≤100)。随后一行按格式a1/b1 a2/b2 ...
给出N
个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。输出格式:
输出上述数字和的最简形式 —— 即将结果写成
整数部分 分数部分
,其中分数部分写成分子/分母
,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。输入样例1:
5 2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2 4/3 2/3
输出样例2:
2
输入样例3:
3 1/3 -1/6 1/8
输出样例3:
7/24
代码如下:
#include <stdio.h> #include <math.h> int gcd(int z, int m) { int r; while (m) { r = z % m; z = m; m = r; } return z < 0 ? -z : z; } int main () { int n ,m ; scanf("%d",&n); long long int fz = 0,fm = 1; int a,b; for(int i = 0;i<n;++i) { scanf("%d/%d",&a,&b); fz = fz *b +fm*a; fm =fm*b; m = gcd(fz, fm); fz /= m; fm /= m; } if (fz % fm == 0) { printf("%lld", fz / fm); } else if (fz && (fz < fm)) { printf("%lld/%lld", fz, fm); } else { printf("%lld %lld/%lld", fz / fm, fz % fm, fm); } return 0; }