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

练习4-7 求e的近似值 (15 分)

自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:

输入第一行中给出非负整数 n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180

//j应该是double类型的变量,否则再付给sum之前会进行整型的去小数运算

#include <stdio.h>
int main()
{
    int n, i;
    double sum = 1, j = 1;
    scanf("%d", &n);
    for(i = 1; i <= n; i++)
    {
        j *= i;
        sum += 1 / j;
    }
    printf("%.8lf", sum);
    return 0;
}

习题4-2 求幂级数展开的部分和 (20 分)

已知函数ex可以展开为幂级数1+x+x2/2!+x3/3!+⋯+xk/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。

输入格式:

输入在一行中给出一个实数x∈[0,5]。

输出格式:

在一行中输出满足条件的幂级数部分和,保留小数点后四位。

输入样例:

1.2

输出样例:

3.3201

//1.  x的n次幂要用y*=x;来循环表示,不能用x*=x,这样x的值会一直变化。2.要用 j*=i来表示分母,不能用(i*j)这样j一直不会变化;

#include <stdio.h>
int main()
{
    double x, y, i = 1, j = 1;
    scanf("%lf", &x);
    y = x;
    double sum = 1 + x;
 
    do{
        y *= x;        
        i++;
        j *= i;
        sum += y / j;
    }while(y / j >= 0.00001);
    printf("%.4lf", sum);
    return 0;
}

习题4-3 求分数序列前N项和 (15 分)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

20

输出样例:

32.66

//变量需要是double型不能是float型,float型会报错,当N足够大是float的范围可能不够

#include <stdio.h>
int main()
{
    int N, i;
    double a = 2, b = 1, t;
    double sum = 0;
    scanf("%d", &N);
    for(i = 1; i <= N; i++)
    {
        sum += a / b;
        t = b;
        b = a;
        a = a + t;
    }
    printf("%.2lf", sum);
    return 0;
}

习题4-4 特殊a串数列求和 (20 分)

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:

输入在一行中给出不超过9的正整数a和n。

输出格式:

在一行中按照“s = 对应的和”的格式输出。

输入样例:

2 3

输出样例:

s = 246

//理解错误!aa:指的是a十a不是a*a,即当a= 2时,aa = 22;如果是乘法会加“*”的。

#include <stdio.h>
int main()
{
    int a, n, i, j = 0, s = 0;
    scanf("%d %d", &a, &n);
    for(i = 0; i < n; i++)
    {
        j = j * 10 +a;
        s += j;
    }
    printf("s = %d", s);
    return 0;
}

习题4-5 换硬币 (20 分)

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:

13

输出样例:

fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

//理解错误:题中的零钱数额x的单位为分,从输出样例可以看出             2.k的值可由i、j得到,它们之间有关系式 x - i*5 + j * 2 == k;这样可以少写一个for循环

#include <stdio.h>
int main()
{
    int x;
    int total = 0, count = 0;
    int i, j, k;
    scanf("%d", &x);
    for(i = (x - 2 - 1) / 5; i >= 1 ; i--)
    {
        for(j = (x - i * 5 - 1) / 2; j >= 1; j--)
        {
            k = (x - i * 5 - j * 2);
            if(i * 5 + j * 2 + k * 1 == x)
            {    
                 total = i + j + k;   
                 printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", i, j, k, total);   
                 total = 0;
                    count++;   
                
            }    
        }
    }
    printf("count = %d", count);
    return 0;
}

习题4-6 水仙花数 (20 分)

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

//弄错了变量l和sum的更新位置,不能用N作为while的循环条件,否则只能用一次

#include <stdio.h>
int main()
{
    int N, i, j = 0, k, a, b, sum, l;
    scanf("%d", &N);
    for(i = 0; i < N; i++)
    {
        j = j * 10 + 9;
    }
    
    for(i = (j + 1) / 10; i <= j; i++)
    {
        k = i;
        
        sum = 0;//
        
        while(k != 0)
        {
            b = k % 10;
            a = 1;
            l = N;
            while(l != 0)
            {
                a *= b;
                l--;
            }
            sum += a;
            
            
            k /= 10;
        }
        if(sum == i)
            printf("%d\n", i);
    }
    return 0;
}

习题4-7 最大公约数和最小公倍数 (15 分)

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(≤1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

//1. 忘记了三目运算符的格式:min = (M > N) ? N : M;  2. 最大公约数(从1开始即1也是约数):gcd(greatest common divisor)    最小公倍数(M*N/gcd):lcm(Least common multiple)

#include <stdio.h>
int main()
{
    int M, N, i, min, yueshu, beishu;
    scanf("%d %d", &M, &N);
    min = (M > N) ? N : M;
    for(i = 1; i <= min; i++)
    {
        if(M % i == 0 && N % i == 0)
        {
            yueshu = i;
        }
    }
    beishu = M * N / yueshu;
    printf("%d %d", yueshu, beishu);
    return 0;
}

习题4-9 打印菱形图案 (15 分)

本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:

输入在一行中给出一个正的奇数n。

输出格式:

输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

      * 
    * * * 
  * * * * * 
* * * * * * * 
  * * * * * 
    * * * 
      * 

//有点麻烦

#include <stdio.h>
int main()
{
    int n, i, j, space;
    scanf("%d", &n);
    for(i = 1; i <= n / 2 + 1; i++)
    {
        for(space = n / 2 - i + 1; space >= 1; space--)
        {
            printf("  ");
        }
            for(j = 1; j <= 2 * i - 1; j++)
                printf("* ");        
        printf("\n");    
    }
    for(i = 1; i <= n / 2; i++)
    {
        for(space = 1; space <= i; space++)
        {
            printf("  ");
        }
           
            for(j = 2 * (n / 2 - i + 1) - 1; j >= 1; j--)
            {
                printf("* ");
            }
        
        printf("\n");    
    }
    return 0;
}

习题6-7 简单计算器 (20 分)

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10

//1.不会做。 2.Switch格式忘了

#include <stdio.h>
int main()
{
    int n1, n2;
    char c;
    scanf("%d %c", &n1, &c);
    while(c != '=')
    {
        scanf("%d", &n2);
        switch(c)
        {
                
        
        case '+': n1 += n2;break;
        case '-': n1 -= n2;break;
        case '*': n1 *= n2;break;
        case '/': 
            if(n2 != 0)
            {
                n1 /= n2;
                break;
            }
            else
                printf("ERROR");return 0;
        default: printf("ERROR");return 0;
        }
        scanf("%c", &c);
    }
    printf("%d", n1);
        
    return 0;
}

今日总结:

题目逐渐变难,要控制好做题时间,一旦超过时间就不要做了,直接看答案。今天做了15道题,效率很低,明天要振作精神了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值