目录
6-1 简单输出整数 (10 分)
本题要求实现一个函数,对给定的正整数N
,打印从1到N
的全部正整数。
函数接口定义:
void PrintN ( int N );
其中N
是用户传入的参数。该函数必须将从1到N
的全部正整数顺序打印出来,每个数字占1行。
裁判测试程序样例:
#include <stdio.h>
void PrintN ( int N );
int main ()
{
int N;
scanf("%d", &N);
PrintN( N );
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
结尾无空行
输出样例:
1
2
3
结尾无空行
答案
void PrintN ( int N ){
int i;
for(i=1;i<=N;i++)printf("%d\n",i);
}
6-2 多项式求值 (15 分)
本题要求实现一个函数,计算阶数为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
结尾无空行
答案:
#include <math.h>
double f( int n, double a[], double x ){
double sum=0;
int i;
for ( i=0; i<=n; i++ )
sum=sum+(a[i]*pow(x,i));
return sum;
}
6-3 简单求和 (10 分)
本题要求实现一个函数,求给定的N
个整数的和。
函数接口定义:
int Sum ( int List[], int N );
其中给定整数存放在数组List[]
中,正整数N
是数组元素个数。该函数须返回N
个List[]
元素的和。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int Sum ( int List[], int N );
int main ()
{
int List[MAXN], N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%d", &List[i]);
printf("%d\n", Sum(List, N));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
12 34 -5
结尾无空行
输出样例:
41
结尾无空行
答案:
int Sum ( int List[], int N ){
int sum=0,i;
for(i=0;i<N;i++)sum+=List[i];
return sum;
}
6-4 求自定类型元素的平均 (10 分)
本题要求实现一个函数,求N
个集合元素S[]
的平均值,其中集合元素的类型为自定义的ElementType
。
函数接口定义:
ElementType Average( ElementType S[], int N );
其中给定集合元素存放在数组S[]
中,正整数N
是数组元素个数。该函数须返回N
个S[]
元素的平均值,其值也必须是ElementType
类型。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
typedef float ElementType;
ElementType Average( ElementType S[], int N );
int main ()
{
ElementType S[MAXN];
int N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%f", &S[i]);
printf("%.2f\n", Average(S, N));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
12.3 34 -5
结尾无空行
输出样例:
13.77
结尾无空行
答案:
ElementType Average( ElementType S[], int N ){
ElementType sum=0;
int i;
for ( i=0; i<N; i++ )sum+=S[i];
sum=sum/N;
return sum;
}
6-5 求自定类型元素的最大值 (10 分)
本题要求实现一个函数,求N
个集合元素S[]
中的最大值,其中集合元素的类型为自定义的ElementType
。
函数接口定义:
ElementType Max( ElementType S[], int N );
其中给定集合元素存放在数组S[]
中,正整数N
是数组元素个数。该函数须返回N
个S[]
元素中的最大值,其值也必须是ElementType
类型。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
typedef float ElementType;
ElementType Max( ElementType S[], int N );
int main ()
{
ElementType S[MAXN];
int N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%f", &S[i]);
printf("%.2f\n", Max(S, N));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
12.3 34 -5
结尾无空行
输出样例:
34.00
结尾无空行
答案:
ElementType Max( ElementType S[], int N ){
ElementType max=S[0];
int i;
for ( i=1; i<N; i++ )if(S[i]>max)max=S[i];
return max;
}
6-6 求单链表结点的阶乘和 (15 分)
本题要求实现一个函数,求单链表L
结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int
范围内。
函数接口定义:
int FactorialSum( List L );
其中单链表List
的定义如下:
typedef struct Node *PtrToNode;
struct Node {
int Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node *PtrToNode;
struct Node {
int Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
int FactorialSum( List L );
int main()
{
int N, i;
List L, p;
scanf("%d", &N);
L = NULL;
for ( i=0; i<N; i++ ) {
p = (List)malloc(sizeof(struct Node));
scanf("%d", &p->Data);
p->Next = L; L = p;
}
printf("%d\n", FactorialSum(L));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
5 3 6
结尾无空行
输出样例:
846
结尾无空行
答案:
int Factorial( int n );
int FactorialSum( List L ){
int sum=0;
List p=L;
while(p){
sum+=Factorial(p->Data);
p=p->Next;
}
return sum;
}
int Factorial( int n ){
if(n==0||n==1)return 1;
else return n*Factorial(n-1);
}
6-7 统计某类完全平方数 (20 分)
本题要求实现一个函数,判断任一给定整数N
是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
函数接口定义:
int IsTheNumber ( const int N );
其中N
是用户传入的参数。如果N
满足条件,则该函数必须返回1,否则返回0。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
int IsTheNumber ( const int N );
int main()
{
int n1, n2, i, cnt;
scanf("%d %d", &n1, &n2);
cnt = 0;
for ( i=n1; i<=n2; i++ ) {
if ( IsTheNumber(i) )
cnt++;
}
printf("cnt = %d\n", cnt);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
105 500
结尾无空行
输出样例:
cnt = 6
结尾无空行
答案:
int IsTheNumber(const int N) {
int a = sqrt(N);
if (a * a == N) {
int num[10] = {0};
int n = N,j = 0, temp;
do {
num[j] = n % 10;
temp = num[j];
for (int i = 0; i < j; i++) {
//TODO
if (num[i] == temp) {
//TODO
return 1;
}
}
n = n / 10;
j++;
}while(n);
}
return 0;
}
6-8 简单阶乘计算 (10 分)
本题要求实现一个计算非负整数阶乘的简单函数。
函数接口定义:
int Factorial( const int N );
其中N
是用户传入的参数,其值不超过12。如果N
是非负整数,则该函数必须返回N
的阶乘,否则返回0。
裁判测试程序样例:
#include <stdio.h>
int Factorial( const int N );
int main()
{
int N, NF;
scanf("%d", &N);
NF = Factorial(N);
if (NF) printf("%d! = %d\n", N, NF);
else printf("Invalid input\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
5
结尾无空行
输出样例:
5! = 120
结尾无空行
答案:
int Factorial( const int N ){
int sum=1,i;
if(N>0)for(i=1;i<=N;i++)sum*=i;
else if(N==0)sum=1;
else return 0;
return sum;
}
6-9 统计个位数字 (15 分)
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-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 n = N, cnt = 0, temp;
if(n<0)n=-n;
do {
temp = n % 10;
n = n / 10;
if (D == temp) {
cnt++;
}
} while (n);
return cnt;
}
6-10 阶乘计算升级版 (20 分)
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N
是用户传入的参数,其值不超过1000。如果N
是非负整数,则该函数必须在一行中打印出N
!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
15
结尾无空行
输出样例:
1307674368000
结尾无空行
答案:此代码原出处
void Print_Factorial(const int N) {
long NF = 1;
if (N >= 0 && N <= 12) {
for (int i = 0; i <= N; i++) {
if (i == 0) {
NF = 1;
}
else {
NF = NF*i;
}
}
printf("%d\n", NF);
}
else if (N > 12 && N <= 1000) {
int Num[3001] = { 0 }; //确保保存最终运算结果的数组足够大:1-9是1*9=9位,10-99是2*90=180位,100-999是3*900=2700位,1000是4*1=4位,总计2893约3000位
int i, j, k, n;
k = 1; //位数
n = 0; //进位
Num[0] = 1; //将结果先初始化为1
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
for (i = 2; i <= N; i++) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for (j = 0; j < k; j++)
{
temp = Num[j] * i + n; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
Num[j] = temp % 10; //更新临时结果的位上信息
n = temp / 10; //看是否有进位
}
while (n != 0)
{ //如果有进位
Num[k] = n % 10; //新加一位,添加信息。位数增1
k++;
n = n / 10; //看还能不能进位
}
}
for (i = k - 1; i >= 0; i--)
{
printf("%d", Num[i]); //显示结果
}
printf("\n");
}
else {
printf("Invalid input\n");
}
6-11 求自定类型元素序列的中位数 (25 分)
本题要求实现一个函数,求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 ) {
ElementType temp;
//希尔排序
for (int gap = N / 2; gap > 0; gap = gap / 2) {
for (int i = gap; i < N; i++) {
for (int j = i - gap; j >= 0 && A[j] > A[j + gap]; j = j - gap) {
temp = A[j];
A[j] = A[j + gap];
A[j + gap] = temp;
}
}
}
return A[N / 2];
}
6-12 判断奇偶性 (10 分)
本题要求实现判断给定整数奇偶性的函数。
函数接口定义:
int even( int n );
其中n
是用户传入的整型参数。当n
为偶数时,函数返回1;n
为奇数时返回0。注意:0是偶数。
裁判测试程序样例:
#include <stdio.h>
int even( int n );
int main()
{
int n;
scanf("%d", &n);
if (even(n))
printf("%d is even.\n", n);
else
printf("%d is odd.\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
-6
结尾无空行
输出样例1:
-6 is even.
结尾无空行
输入样例2:
5
输出样例2:
5 is odd.
答案:
int even( int n ){
if(n==0)return 1;
else if(n%2==0)return 1;
else return 0;
}
6-13 折半查找 (15 分)
给一个严格递增数列,函数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 T, KeyType k) {
int length = T.length;
int left = 0, right = length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (k == T.R[middle].key)return middle;
else if (k > T.R[middle].key) {
left = middle + 1;
} else if (k < T.R[middle].key) {
right = middle - 1;
}
}
return 0;
}