6-1 弹球距离
设有一个球从高度为h米的地方落下,碰到地面后又弹到高度为原来p倍的位置,然后又落下,再弹起,再落下…。请编写函数求初始高度为h的球下落后到基本停下来(高度小于给定阈值TOL)时在空中所经过的路程总和。
函数接口定义:
double dist( double h, double p );
其中
h
是球的初始高度,p
是球弹起高度与弹起前落下高度的比值;函数dist
要返回球下落后到基本停下来时在空中所经过的路程总和。注意:当弹起的高度小于裁判程序定义的常数TOL
时,弹起的距离不计算在内。裁判测试程序样例:
#include <stdio.h> #define TOL 1E-3 double dist( double h, double p ); int main() { double h, p, d; scanf("%lf %lf", &h, &p); d = dist(h, p); printf("%.6f\n", d); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
1.0 0.4
输出样例:
2.331149
square=2.666667 cube=4.000000 sin=1.416147
double dist(double h,double p) { double s = 0; while(1) { s=s+h; if(h*p>=TOL) { s=s+h*p; h=h*p; } else break; } return s; }
6-2 多项式求值
本题要求实现一个函数,计算阶数为
n
,系数为a[0]
...a[n]
的多项式f(x)=∑i=0n(a[i]×xi) 在x
点的值。函数接口定义:
double f( int n, double a[], double x );
其中
n
是多项式的阶数,a[]
中存储系数,x
是给定点。函数须返回多项式f(x)
的值。裁判测试程序样例:
#include <stdio.h> #define MAXN 10 double f( int n, double a[], double x ); int main() { int n, i; double a[MAXN], x; scanf("%d %lf", &n, &x); for ( i=0; i<=n; i++ ) scanf("%lf", &a[i]); printf("%.1f\n", f(n, a, x)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
2 1.1 1 2.5 -38.7
输出样例:
-43.1
2.331149
double f(int n ,double a[],double x){ double sum = 0; for(int i = 0;i<=n ;++i){ sum += a[i] * pow(x,i); } return sum; }
6-3 求自定类型元素序列的中位数
本题要求实现一个函数,求
N
个集合元素A[]
的中位数,即序列中第⌊(N+1)/2⌋大的元素。其中集合元素的类型为自定义的ElementType
。函数接口定义:
ElementType Median( ElementType A[], int N );
其中给定集合元素存放在数组
A[]
中,正整数N
是数组元素个数。该函数须返回N
个A[]
元素的中位数,其值也必须是ElementType
类型。裁判测试程序样例:
#include <stdio.h> #define MAXN 10 typedef float ElementType; ElementType Median( ElementType A[], int N ); int main () { ElementType A[MAXN]; int N, i; scanf("%d", &N); for ( i=0; i<N; i++ ) scanf("%f", &A[i]); printf("%.2f\n", Median(A, N)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
3 12.3 34 -5
输出样例:
12.30
ElementType Median( ElementType A[], int N ) { int gap; for(gap=N/2;gap>0;gap/=2) { for(int i = gap;i<N;i++) { ElementType t = A[i]; int j ; for(j=i-gap;j>=0&&t<A[j];j-=gap) { A[j+gap]=A[j]; } A[j+gap]=t; } } return A[N/2]; }
6-4 统计个位数字
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。
函数接口定义:
int Count_Digit ( const int N, const int D );
其中
N
和D
都是用户传入的参数。N
的值不超过int
的范围;D
是[0, 9]区间内的个位数。函数须返回N
中D
出现的次数。裁判测试程序样例:
#include <stdio.h> int Count_Digit ( const int N, const int D ); int main() { int N, D; scanf("%d %d", &N, &D); printf("%d\n", Count_Digit(N, D)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
-21252 2
输出样例:
3
int Count_Digit ( const int N, const int D ) { int i, j, b = 0; i = N; if (i < 0) i = -i; do { j = i % 10; if (j == D) b++; i /= 10; } while (i > 0); return b; }
6-5 折半查找
给一个严格递增数列,函数int Search_Bin(SSTable T, KeyType k)用来二分地查找k在数列中的位置。
函数接口定义:
int Search_Bin(SSTable T, KeyType k)
其中T是有序表,k是查找的值。
裁判测试程序样例:
#include <iostream> using namespace std; #define MAXSIZE 50 typedef int KeyType; typedef struct { KeyType key; } ElemType; typedef struct { ElemType *R; int length; } SSTable; void Create(SSTable &T) { int i; T.R=new ElemType[MAXSIZE+1]; cin>>T.length; for(i=1;i<=T.length;i++) cin>>T.R[i].key; } int Search_Bin(SSTable T, KeyType k); int main () { SSTable T; KeyType k; Create(T); cin>>k; int pos=Search_Bin(T,k); if(pos==0) cout<<"NOT FOUND"<<endl; else cout<<pos<<endl; return 0; } /* 请在这里填写答案 */
###输入格式:
第一行输入一个整数n,表示有序表的元素个数,接下来一行n个数字,依次为表内元素值。 然后输入一个要查找的值。
###输出格式:
输出这个值在表内的位置,如果没有找到,输出"NOT FOUND"。
输入样例:
5 1 3 5 7 9 7
输出样例:
4
输入样例:
5 1 3 5 7 9 10
输出样例:
NOT FOUND
int Search_Bin(SSTable ST,KeyType key) { int low = 1; int high = ST.length; while(low <= high) { int mid = (low + high)/2; if(key == ST.R[mid].key) { return mid; }else if(key < ST.R[mid].key) { high = mid - 1; } else { low = mid + 1; } } return 0; }
6-6 计算最长的字符串长度
本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。
函数接口定义:
int max_len( char *s[], int n );
其中
n
个字符串存储在s[]
中,函数max_len
应返回其中最长字符串的长度。裁判测试程序样例:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10 #define MAXS 20 int max_len( char *s[], int n ); int main() { int i, n; char *string[MAXN] = {NULL}; scanf("%d", &n); for(i = 0; i < n; i++) { string[i] = (char *)malloc(sizeof(char)*MAXS); scanf("%s", string[i]); } printf("%d\n", max_len(string, n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
4 blue yellow red green
输出样例:
6
int max_len( char *s[], int n ) { int max = strlen(s[0]); int j = 0; for(j = 0;j<n;++j) { if(max <strlen(s[j])) max = strlen(s[j]); } return max; }
6-7 空心的数字金字塔
本题要求实现一个函数,输出n行空心的数字金字塔。
函数接口定义:
void hollowPyramid( int n );
其中
n
是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n
行空心的数字金字塔,请注意,最后一行的第一个数字前没有空格。裁判测试程序样例:
#include <stdio.h> void hollowPyramid ( int n ); int main() { int n; scanf("%d", &n); hollowPyramid ( n ); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
5
输出样例:
1 2 2 3 3 4 4 555555555
void hollowPyramid( int n ) { int i,j,k,f; for(i=1;i<n;i++) { for(k=1;k<=n-i;k++) printf(" "); printf("%d",i); if(i==1) printf("\n"); if(i!=1) { for(j=1;j<(i-1)*2;j++) printf(" "); printf("%d\n",i); } } for(i=1;i<2*n;i++) printf("%d",n); }
6-8 用二分法解方程
设曲线方程f(x)=0在区间[a,b]上连续,如果f(a)f(b)<0,则方程在区间内至少存在一个根r,使得f(r)=0. 现在要求用二分法编写一个求解各类一元方程方程在给定区间解的通用函数,调用该函数来求下列三个方程在区间[a,b]上的解.
(1) x2−5=0
(2) x3−5=0
(3) sinx=0
要求:
编写的函数要能判断在给定区间上是否有解,如果有解按照二分法进行求解,如果无解函数返回一个实数值-32768
作为无解的标志。函数接口定义:
double bisection(double (*f)(),double a,double b)
其中 参数
f
是一个指向函数的指针变量。参数a
和b
是解区间的两个端点,函数的返回值为方程在区间上的解。裁判测试程序样例:
#include <stdio.h> #include <math.h> double quadratic(double x) /*一个一元二次函数f*/ { return x*x-5; } double cubic(double x) /*一个一元三次函数f*/ { return x*x*x-5; } /* 你编写的二分法解方程的函数放在这里 */ int main() { double x; double a,b; scanf("%lf%lf",&a,&b); //输入解区间左右端点的值 x=bisection(quadratic,a,b); //解一元二次方程 printf("%.3f\n",x); x=bisection(cubic,a,b); //解一元三次方程 printf("%.3f\n",x); x=bisection(sin,a,b); //求解方程sinx=0 printf("%.3f\n",x); return 0; }
输入样例1:
以下输入的两个数是区间[a,b]的端点
1.0 4.0
输出样例1:
2.236 1.710 3.142
输入样例2:
以下输入的两个数是区间[a,b]的端点
4.0 6.0
输出样例2:
-32768.000 -32768.000 -32768.000
double bisection(double (*f)(),double a,double b) { if(f(a)*f(b)>0) { return -32768; } double m; while(b>a) { m=(a+b)/2; if(fabs(f(m))<1e-15) { return m; } if(f(m)*f(a)>0) { a=m; } else { b=m; } } }
6-9 求一元函数定积分
一元函数f(x)在区间[a,b]上定积分∫abf(x)dx的几何意义是被积函数与横坐标轴以及直线x=a和直线x=b围成的曲边形的面积。依据几何意义求定积分的方法是将这个区域按x轴方向等分成若干个细小的条状区域,每个小区域近似于一个梯形(如图所示),计算出所有小梯形面积之和就可计算出区域面积的近似值。区间划分的越细求得的结果越精确。
现在要求用梯形法编写一个求一元定积分的函数,调用该函数求解以下三个函数在给定区间的定积分。
(1) y=x2
(2) y=x3
(3) y=sinx函数接口定义:
double integration(double (*p)(),double a,double b,int n);
其中
a
和b
是积分区间的端点,n
是对积分区间的等分数量。p
是一个指向函数的指针。裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> #include <math.h> double square(double x) { return x*x; } double cube(double x) { return x*x*x; } /*你编写的积分函数嵌入在这里*/ int main() { /*求平方函数在区间[0,2]上的定积分*/ printf("square=%f\n",integration(square,0,2,10000)); /*求立方函数在区间[0,2]上的定积分*/ printf("cube=%f\n",integration(cube,0,2,10000)); /*求正弦函数在区间[0,2]上的定积分*/ printf("sin=%f\n",integration(sin,0,2,10000)); return 0; }
输入样例:
0 2 100000
输出样例:
square=2.666667 cube=4.000000 sin=1.416147
double integration(double (*p)(), double a, double b, int n) { double h = (b - a) / n; double sum = 0.5 * ((*p)(a) + (*p)(b)); for (int i = 1; i < n; i++) { sum += (*p)(a + i * h); } return sum * h; }