PAT入门题,新手上路提升自信心
题目地址
6-1 简单输出整数(10分)
本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数。
void PrintN(int n)
{
for (int i = 1; i <= n; i++)
{
printf("%d\n", i);
}
}
总结
c语言标准输入输出为scanf()和printf()
所需头文件为#include <stdio.h>
6-2 多项式求值(15分)
本题要求实现一个函数,计算阶数为n,系数为a[0] … a[n]的多项式
在x点的值。
double f( int n, double a[], double x )
{
double sum = 0;
double temp = 0;
for (int i = 0; i <= n; i++)
{
sum += a[i] * pow(x,i);
}
return sum;
}
pow(x,y) 为x的y次方,x,y皆为double型
6-3 简单求和(10分)
本题要求实现一个函数,求给定的N个整数的和。
int Sum ( int List[], int N )
{
int sum = 0;
for (int i = 0; i < N; i++)
{
sum += List[i];
}
return sum;
}
6-4 求自定类型元素的平均(10分)
本题要求实现一个函数,求N个集合元素S[]的平均值,其中集合元素的类型为自定义的ElementType。
ElementType Average( ElementType S[], int N )
{
ElementType sum;
for (int i = 0; i < N; i++)
{
sum += S[i];
}
ElementType average = sum/N;
return average;
}
6-5 求自定类型元素的最大值 (10分)
本题要求实现一个函数,求N个集合元素S[]中的最大值,其中集合元素的类型为自定义的ElementType。
ElementType Max( ElementType S[], int N )
{
ElementType max = S[0];
for (int i = 1; i < N; i++)
{
if (max < S[i])
max = S[i];
}
return max;
}
6-6 求单链表结点的阶乘和 (15分)
本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。
int FactorialSum( List L )
{
int factorialSum = 0;
while (L != NULL)
{
int factoria;
if (L->Data == 0)
{
factoria = 1;
}
else
{
factoria = L->Data;
for (int i = 1; i <= (L->Data - 1); i++)
{
factoria *= i;
}
}
factorialSum += factoria;
L = L->Next;
}
return factorialSum;
}
易错点
o的阶乘为1.。。。。被这玩意卡了半天就离谱
6-7 统计某类完全平方数 (20分)
本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
#include <string.h>
int IsTheNumber ( const int N )
{
int n = N;
double a = sqrt(n); //目标数的平方根
double mod = fmod(a,1); //目标数的小数部分
//bool isPerSqu = ( 0 == mod); //c语言中无bool类型
if (mod) //如果不是完全平方数就可以直接返回0
{
return 0;
}
int arr[10];
memset(arr, 0, sizeof(arr)); //作用:用于标记数中出现过的数字
while (n >= 1)
{
int portion = n % 10; //通过模10,一步步的将数字取出
if (arr[portion] == 1) //该数字已经出现过
{
return 1; //printf("该数至少有两个相同的数\n");
}else
{
arr[portion] = 1;
}
n /= 10;
}
return 0;
}
总结
使用arr[10];memset(arr, 0, sizeof(arr)); 用来记录数字出现的次数
memset(数组地址,所赋的值,数组大小)需要#include<string.h>头文件,而且仅建议赋值0和-1 (与memset函数赋值原理有关 ,其他数字建议使用fill函数)
c语言中没有bool类型。。。
0为假,非0为真
易出问题的地方:对于判断数字出现的次数,循环的判断条件为n>=1时,需要额外添加当传入数字为0时,将下标为0的数字改为1
6-8 简单阶乘计算 (10分)
本题要求实现一个计算非负整数阶乘的简单函数。
int Factorial(int N)
{
int n = N;
//第一步判断是否为小数或者为负数
double mod = fmod(n,1); //提取目标数的小数部分
if (mod || n < 0) //存在小数部分或者为负数直接返回0
{
return 0;
}
else if (n == 0)
{
return 1;
}
int factoria = 1;
for (int i = 1; i <= n; i++)
{
factoria *= i;
}
return factoria;
}
总结
double型数字不能进行%运算,故欲对double型变量进行取模操作时,可以使用fmod()函数,(在有stdio头文件的情况下不需要额外添加头文件)
6-9 统计个位数字 (15分)
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。
int Count_Digit(int n,int d)
{
//创建记录数字出现次数的数组
int arr[10];
memset(arr,0,sizeof(arr));
//统计数字
if (n == 0)
{
arr[0] = 1;
}else if(n < 0)
{
n = 0-n;
}
int protion = 0;
while (n >= 1)
{
protion = n % 10;
arr[protion] += 1;
n /= 10;
}
return arr[d];
}
错误点总结
当采用取模法判断数中出现的数字(因为循环的判断条件为n>=1)
1.当n为0时,需单独操作:将arr[0] = 1;
2.当n小于0时,将n=0-n; 再接上后续常规操作