算法实战(一)

2024-01-09 14:08:16

题目来源(PAT题目)

6-2 多项式求值

在这里插入图片描述
裁判测试程序样例:

#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;
}

/* 你的代码将被嵌在这里 */

题解:

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;
    else
        number=-N;
    if(N==0&&D==0) // 如果是0的话,统计也是0出现的次数,直接返回1即可。
        return 1;
    while(number){ // 遍历去判断每一位是否和给出的D相同
        if(number%10==D)
            count++;
        number/=10;
    }
    return count;
}

文章来源:https://blog.csdn.net/m0_49635911/article/details/135476724
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。