基础编程题
- 题目来源([PAT题目](https://pintia.cn/problem-sets/14/exam/problems/type/6))
- 6-2 多项式求值
- 6-5 求自定类型元素的最大值
- 6-6 求单链表结点的阶乘和
- 6-7 统计某类完全平方数
- 6-9 统计个位数字
题目来源(PAT题目)
6-2 多项式求值
裁判测试程序样例:
#include <stdio.h>#define MAXN 10double 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;
}/* 你的代码将被嵌在这里 */
题解:
double f( int n, double a[], double x ){int i;double sum=0;// 用于求和for(i=0;i<=n;i++)sum+=(a[i]*pow(x,i)); // pow是math里面库函数,使用时注意x,i为浮点数return sum;
}
6-5 求自定类型元素的最大值
裁判测试程序样例:
#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;
}/* 你的代码将被嵌在这里 */
题解一:
ElementType Max( ElementType S[], int N )
{ElementType maxNum=S[0];for(int i = 1;i<N;i++){// 使用三元表达式maxNum = maxNum> S[i]? maxNum : S[i];}return maxNum;
}
题解二:
ElementType Max( ElementType S[], int N )
{ElementType maxNum=S[0]; // 假设下标为0的元素为最大值for(int i = 1;i<N;i++)if(maxNum<S[i]) // 如果maxNum小于S[i],就更新maxNum=S[i];return maxNum;
}
6-6 求单链表结点的阶乘和
裁判测试程序样例:
#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;
}/* 你的代码将被嵌在这里 */
题解:
// 采用递归求阶乘
int Factorial(int n){if(n==0)return 1;return n*Factorial(n-1);
}
int FactorialSum( List L ){PtrToNode p;int Fsum=0;p=L;while(p){ // 遍历整个链表Fsum+=Factorial(p->Data);p=p->Next;}return Fsum;
}
6-7 统计某类完全平方数
裁判测试程序样例:
#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;
}/* 你的代码将被嵌在这里 */
题解:
int IsTheNumber ( const int N ){// sqrt函数返回值为double类型,由于定义的是int数据,在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,如果不是完全平方数的话,后面肯定会损失精度int number=N,array[10]={0},m=sqrt(number);if(m*m==number){ // 判断是不是完全平方数while(number){array[number%10]++; //使用辅助数组记录每个位出现的次数number/=10;}for(int i=0;i<=9;i++){ // 遍历循环,如果对应位置大于1,就说明至少有两位数字相同if(array[i]>1)return 1;}}return 0;
}
C语言类型转换:详细讲解
6-9 统计个位数字
裁判测试程序样例:
#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;
}/* 你的代码将被嵌在这里 */
题解:
int Count_Digit ( const int N, const int D ){int number,count=0;if(N>0)number=N;elsenumber=-N;if(N==0&&D==0) // 如果是0的话,统计也是0出现的次数,直接返回1即可。return 1;while(number){ // 遍历去判断每一位是否和给出的D相同if(number%10==D)count++;number/=10;}return count;
}