做题平台为PTA,练习巩固基础,记录当下生活~
1.简单输出整数
本题要求实现一个函数,对给定的正整数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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解答:
void PrintN ( int N )
{
for(int i=1;i<=N;i++)
{
printf("%d",i);
printf("\n");
}
}
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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解答:
double f( int n, double a[], double x )
{
double sum=0;
double x1=1;
for(int i=0;i<=n;i++)
{
for(int j=0;j<i;j++)
{
x1=x1*x;
}
sum=sum+a[i]*x1;
x1=1;
}
return sum;
}
这样解分数只能得一部分
超时,说明时间复杂度需要优化,现在是两层for循环,最好可以优化为一层for循环,如下:
double f( int n, double a[], double x )
{
double sum=a[0];//直接将总和初始化为a[0]*x^0,也就是a[0]
int i;
double m=1;
//将x的0次幂排除在外
for(i=1;i<=n;i++){
m=m*x;
sum=sum+a[i]*m;
}
return sum;
}
3.简单求和
本题要求实现一个函数,求给定的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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解答:
int Sum ( int List[], int N )
{
int sum=0;
for(int i = 0;i<N;i++)
{
sum=sum+List[i];
}
return sum;
}
4.求自定类型元素的平均
本题要求实现一个函数,求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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解答:
ElementType Average( ElementType S[], int N )
{
ElementType sum=0;
for(int i=0;i<N;i++)
{
sum=sum+S[i];
}
return sum/N;
}
5.求自定类型元素的最大值
本题要求实现一个函数,求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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解答:
ElementType Max( ElementType S[], int N )
{
ElementType max=S[0];
for(int i=0;i<N;i++)
{
if(max<S[i])
{
max=S[i];
}
}
return max;
}
6.求单链表结点的阶乘和
本题要求实现一个函数,求单链表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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解答:
int FactorialSum( List L ){
int sum = 0;
PtrToNode p = L;
while(p != NULL){
int val = p->Data, i, fac = 1;
//对val求阶乘
for(i = val;i > 1;i--){
fac = fac*i;
}
sum += fac;
p = p->Next;
}
return sum;
}
愿与诸位道友继续努力!