2022/2/7——浙大版《C语言程序设计(第3版)》题目集PAT错题记录(做了17道题)

习题5-4 使用函数求素数和 (20 分)

本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。

素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:

int prime( int p );
int PrimeSum( int m, int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[mn]内所有素数的和。题目保证用户传入的参数mn

裁判测试程序样例:

#include <stdio.h>
#include <math.h>

int prime( int p );
int PrimeSum( int m, int n );
    
int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
        if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}

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

输入样例:

-1 10

输出样例:

Sum of ( 2 3 5 7 ) = 17

//加不加else if(p == 2)return 1;这句话,结果都显示正确,是因为sqrt(2)=根号2,也就是说给i赋初值2后就因为不满足初始条件而退出循环,返回return1;

int prime( int p )
{
    int i;
    if(p <= 1)
        return 0;
    else if(p == 2)
        return 1;
    for(i = 2; i <= sqrt(p); i++)
    {
        if(p % i == 0)
            return 0;
    }
    return 1;
}
int PrimeSum( int m, int n )
{
    int i, sum = 0;
    for(i = m; i <= n; i++)
    {
        if(prime(i) != 0)
        {
            sum += i;
        }
    }
    return sum;
    
}

习题5-6 使用函数输出水仙花数 (20 分)

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。

函数接口定义:

int narcissistic( int number );
void PrintN( int m, int n );

函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。

函数PrintN则打印开区间(mn)内所有的水仙花数,每个数字占一行。题目保证100≤mn≤10000。

裁判测试程序样例:

#include <stdio.h>

int narcissistic( int number );
void PrintN( int m, int n );
    
int main()
{
    int m, n;
  
    scanf("%d %d", &m, &n);
    if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
    PrintN(m, n);
    if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);

    return 0;
}

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

输入样例:

153 400

输出样例:

153 is a narcissistic number
370
371

 //1.不细心,看错了区间,打印出给定区间(m,n)内所有的水仙花数,不包括m和n。2.通过取余数用数组存放number的各位,再用pow函数求值要简单许多

int narcissistic( int number )
{
    int sum = 0, remainder, a = 1;
    int n1 = number;
    int n2 = number;
    while(n1 > 0)
    {
        remainder = n1 % 10;
        while(n2 > 0)
        {
            a *= remainder;
            n2 /= 10;
        }
        n1 /= 10;
        sum += a;
        a = 1;
        n2 = number;
    }
    if(sum == number)
        return 1;
    else
        return 0;
        
}
void PrintN( int m, int n )
{
    int i;
    for(i = m + 1; i < n; i++)
    {
        if(narcissistic(i) == 1)
            printf("%d\n", i);
    }
}

习题5-7 使用函数求余弦函数的近似值 (15 分)

本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:

cos(x)=x0/0!−x2/2!+x4/4!−x6/6!+⋯

函数接口定义:

double funcos( double e, double x );

其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。

裁判测试程序样例:

#include <stdio.h>
#include <math.h>

double funcos( double e, double x );

int main()
{    
    double e, x;

    scanf("%lf %lf", &e, &x);
    printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
    
    return 0;
}

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

输入样例:

0.01 -3.14

输出样例:

cos(-3.14) = -0.999899

//忘了把每项的正负号加进去了

double funcos( double e, double x )
{
    int flag = 1;
    double i = 0, j = 1;
    double sum = 0;
    while(pow(x, 2 * i) / j >= e)
    {
        sum += flag * pow(x, 2 * i) / j;
        i += 1;
        j *= (2 * i ) * (2 * i - 1);
        flag *= -1;
    }
    sum += flag * pow(x, 2 * i) / j;
    return sum;
}

习题6-1 分类统计字符个数 (15 分)

本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。

函数接口定义:

void StringCount( char s[] );

其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 15

void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

/* Your function will be put here */

输入样例:

aZ &
09 Az

输出样例:

letter = 4, blank = 3, digit = 2, other = 1

//1.读题不仔细,space包括空格和回车  2、逻辑判别式少加了括号,一个括号内部的东西算做一个逻辑表达式(一个条件)

void StringCount( char s[] )
{
    int letter = 0, blank = 0, digit = 0, other = 0;
    int i = 0;
    while(s[i] != '\0')
    {
        if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
            letter++;
        else if(s[i] >= '0' && s[i] <= '9')
            digit++;
        else if(s[i] == ' ' || s[i] == '\n')
            blank++;
        else
            other++;
        i++;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other);
}

习题6-3 使用函数输出指定范围内的完数 (20 分)

本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。

函数接口定义:

int factorsum( int number );
void PrintPN( int m, int n );

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

裁判测试程序样例:

#include <stdio.h>

int factorsum( int number );
void PrintPN( int m, int n );
    
int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
    if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
    PrintPN(m, n);

    return 0;
}

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

输入样例1:

6 30

输出样例1:

6 is a perfect number
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

输入样例2:

7 25

输出样例2:

No perfect number

//PrintPN的难点在怎么把完数的因子和式输出, printf("%d = 1", i);printf(" + %d", j);关键在第一个因子可以确定是1,这样就可以让“+”和第二个因子进行结合

int factorsum( int number )
{
    int i = 1, sum = 0;
    while(i <= number / 2)
    {
        if(number % i == 0)
            sum += i;
        i++;
    }
    return sum;
}

void PrintPN( int m, int n )
{
    int i, count = 0;
    for(i = m; i <= n; i++)
    {
        if(factorsum(i) == i)
        {
            printf("%d = 1", i);
            int j = 2;
            while(j <= i / 2)
            {
                if(i % j == 0)
                    printf(" + %d", j);
                j++;
                
            }
            count = 1;
            printf("\n");
            
        }
    }
    if(count == 0)
            printf("No perfect number");
}

习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)

本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

函数接口定义:

int fib( int n );
void PrintFN( int m, int n );

其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[mn]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。

裁判测试程序样例:

#include <stdio.h>

int fib( int n );
void PrintFN( int m, int n );
    
int main()
{
    int m, n, t;

    scanf("%d %d %d", &m, &n, &t);
    printf("fib(%d) = %d\n", t, fib(t));
    PrintFN(m, n);

    return 0;
}

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

输入样例1:

20 100 7

输出样例1:

fib(7) = 13
21 34 55 89

输入样例2:

2000 2500 8

输出样例2:

fib(8) = 21
No Fibonacci number

//又没看清题意,函数PrintFN要在一行中输出给定范围[mn]内的所有Fibonacci数,mn是Fibonacci数也就是fib(i)的值,即fib(i)<=n && fib(i)>=m的全体fib(i)的值得集合

int fib( int n )
{
    if(n == 1 || n == 2)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
void PrintFN( int m, int n )
{
    int i = 1, flag = 0;
    while(fib(i) < m)
    {
        i++;
    }
    while(fib(i) <= n)
    {
       
            if(flag == 0)
            {
                printf("%d", fib(i));
                flag = 1;
                
            }
            else
                printf(" %d", fib(i));
            i++;
    }
    if(flag == 0)
        printf("No Fibonacci number");
}

今日总结:

今天一共做了17道题,基本上按计划完成了,效率还行,做题还是要细心,明天继续加油!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值