PAT : 基础编程题目集_函数题答案(6-1 ~ 6-13)(C语言)

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; 再接上后续常规操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值