C语言刷题笔记2(6)

 6.1

题目描述:使用if和goto语句,求1+2+3+…+100的值。

输入:无

输出:输出题目描述中表达式的值。请注意行尾输出换行。

#include <stdio.h>

int main() {
    int sum = 0;
    int i = 1;
    loop:
    sum += i;
    i++;
    if (i <= 100) {
        goto loop;
    }
    printf("%d\n", sum);
    return 0;
}

注意goto语法的使用

6.3

题目描述:用do…wihle语句求1+2+3+…+100的值。

输入:无

输出:输出题目描述中表达式的值。请注意行尾输出换行。

#include <stdio.h>

int main() {
    int sum = 0;
    int i = 1;
    do {
        sum += i;
        i++;
    } while (i <= 100);
    printf("%d\n", sum);
    return 0;
}

注意while语句的语法

6.5

题目描述:使用这个公式求π的近似值,直到某一项的绝对值小于10-6为止。

输入:无

输出:输出π的近似值,保留6位小数。请注意行尾输出换行。

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

int main() {
    double pi = 0;
    int sign = 1;
    int n = 0;
    double term;
    do {
        term = sign * 1.0 / (2 * n + 1);
        pi += term;
        sign = -sign;
        n++;
    } while (fabs(term) >= 1e-6);
    pi *= 4;
    printf("%.6lf\n", pi);
    return 0;
}

6.6

题目描述:求Fibonacci数列的前40个数。

输入:无

输出:输出Fibonacci数列的前40个数,并在每个数之后输出一个空格。请注意行尾输出换行。

#include <stdio.h>
int  fib(int n) {
    int first = 1, second = 1;
    int result;
    if (n == 0 || n == 1) {
        return 1;
    }
    for (int i = 2; i <= n; i++) {
        result = first + second;
        first = second;
        second = result;
    }
    return result;
}

int main() {
    for (int i = 0; i < 40; i++) {
        long long number = fib(i);
        printf("%d ", number);
    }
    return 0;
}

6.9 电文加密

题目描述:给电文加密。加密规则是对于每一个字符,如果是字母,变换成其相应的其后(循环的字母序,即A紧跟在Z的后面)的第4个字母。例如A变成E,a变成e,W变成A,X变成B,Y变成C,Z变成D。如果不是字母,则不进行变换。

输入:输入一行字符。

输出:输出相应的密码。请注意行尾输出换行。

#include <stdio.h>

int main() {
    char ch;
    while ((ch = getchar()) != '\n') {
            if (ch >= 'A' && ch <= 'V') {
                ch += 4;
            }
            else if (ch >= 'W' && ch <= 'Z') {
                ch -= 22;
            }
            else if (ch >= 'a' && ch <= 'v') {
                ch += 4;
            }
            else if (ch >= 'w' && ch <= 'z') {
                ch -= 22;
            }
            printf("%c", ch);
        }
    return 0;
}

getchar()函数getchar()是 C 语言中的一个输入函数,它从标准输入(通常是键盘)读取一个字符,并返回该字符的 ASCII 码值。这个值被赋给变量ch

循环条件(ch = getchar())!= '\n'表示只要从输入读取到的字符不是换行符\n,循环就会继续执行。这里要注意ch = getchar()是一个赋值表达式,整个表达式的值就是ch的值(即刚读取到的字符的 ASCII 码值),将其与\n的 ASCII 码值进行比较,来决定是否继续循环。

6.10 辗转相除法求最大公约数

题目描述:输入两个正整数m和n,求其最大公约数和最小公倍数。

输入:输入两个正整数m和n,用空格隔开。

输出:分别输出m和n的最大公约数和最小公倍数,用空格隔开。请注意行尾输出换行。

#include <stdio.h>

int main() {
    int m, n, a, b, temp;
    scanf("%d %d", &m, &n);
    a = m;
    b = n;
    // 使用辗转相除法求最大公约数
    while (b!= 0) {
        temp = b;
        b = a % b;
        a = temp;
    }
    // 输出最大公约数
    printf("%d ", a);
    // 计算并输出最小公倍数
    printf("%d\n", m * n / a);
    return 0;
}

6.11 getchar的再使用

题目描述:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

输入:一行字符。

输出:分别输出这行字符中的英文字母、空格、数字和其他字符的个数,用空格隔开。请注意行尾输出换行。

#include <stdio.h>

int main() {
    int letterCount = 0;
    int spaceCount = 0;
    int digitCount = 0;
    int otherCount = 0;
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF) {
        if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
            letterCount++;
        }
        else if (ch == 32) {
            spaceCount++;
        }
        else if (ch >= '0' && ch <= '9') {
            digitCount++;
        }
        else {
            otherCount++;
        }
    }
    printf("%d %d %d %d\n", letterCount, spaceCount, digitCount, otherCount);
    return 0;
}

6.12 适时加入中间变量temp

题目描述:求 的值,其中a是一个数字,n表示a的位数,例如:2+22+222+2222+22222(此时n=5)

输入:两个整数a和n。

输出:计算出的Sn的值。请注意行尾输出换行。

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

6.13 迭代求和

题目描述

输入:无

输出:题目描述中算式的值。请注意行尾输出换行。

#include <stdio.h>

int f(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    else {
        return n * f(n - 1);
    }
}

int main() {
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        sum += f(i);
    }
    printf("%d\n", sum);
    return 0;
}

6.15 水仙花数

题目描述:输出所有“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一个“水仙花数”,因为153=13+53+33。

输入:无

输出:所有“水仙花数”,在每一个数之后输出一个空格。请注意行尾输出换行。

#include <stdio.h>

int main() {
    int num;
    for (num = 100; num < 1000; num++) {
        int bai = num / 100;
        int shi = (num / 10) % 10;
        int ge = num % 10;
        int sum = bai * bai * bai + shi * shi * shi + ge *
        ge * ge;
        if (sum == num) {
            printf("%d\n", num);
        }
    }
    return 0;
}

6.16 完数和因子

题目描述:一个数如果恰好等于它的因子之和,这个数就被称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。找出1000之内的所有完数,并输出。

输入:无

输出:每一个完数一行。在每一行中,首先输出这个完数的值,再输出一个冒号,之后从小到大输出这个完数的所有因子,在每个因子前输出一个空格。请注意行尾输出换行。

#include <stdio.h>

int main() {
    int i, j, sum;
    for (i = 2; i <= 1000; i++) {  // 从2开始,因为1不是完数的讨论范围
        sum = 0;
        for (j = 1; j < i; j++) {
            if (i % j == 0) {
                sum += j;
            }
        }
        if (sum == i) {
            printf("%d:", i);
            for (j = 1; j < i; j++) {
                if (i % j == 0) {
                    printf(" %d", j);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

6.17 迭代斐波那契求和

题目描述:有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13,…求出这个序列的前20项之和。

输入:无

输出:题目描述中的前20项之和,保留4位小数。请注意行尾输出换行。

#include <stdio.h>

double fib(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    double a = 1, b = 1, temp;
    for (int i = 3; i <= n; i++) {
        temp = a + b;
        a = b;
        b = temp;
    }
    return b;
}

int main() {
    double sum = 0;
    double zi = 2, mu = 1;
    for (int i = 0; i < 20; i++) {
        sum += zi / mu;
        double temp = zi;
        zi = zi + mu;
        mu = temp;
    }
    printf("%.4f\n", sum);
    return 0;
}

6.21 牛顿迭代法

题目描述:用牛顿迭代法求以下方程在1.5附近的根

输入:无

输出: 输出牛顿迭代法求出的根,保留4位小数。 请注意行尾输出换行。

#include <stdio.h>

// 定义方程 f(x)
double f(double x) {
    return 2 * x * x * x - 4 * x * x + 3 * x - 6;
}

// 手动计算导数 f'(x)
double df(double x) {
    return 6 * x * x - 8 * x + 3;
}

int main() {
    double x = 1.5;  // 初始值
    double x_next;
    do {
        x_next = x - f(x) / df(x);
        if ((x_next - x) > 0) {
            if (x_next - x < 1e-6) break;
        }
        else {
            if (x - x_next < 1e-6) break;
        }
        x = x_next;
    } while (1);
    printf("%.4lf\n", x);
    return 0;
}

6.22 二分法

题目描述:用二分法求以下方程在(-10, 10)之间的根:

保证此函数在以上区间中是单调递增的。

输入:无

输出:输出二分法求出的根,保留4位小数。请注意行尾输出换行。

#include <stdio.h>

// 定义要求解的方程
double equation(double x) {
    return 2 * x * x * x - 4 * x * x + 3 * x - 6;
}

int main() {
    double left = -10;
    double right = 10;
    double mid;
    double precision = 1e-4;

    while ((right - left) > precision) {
        mid = (left + right) / 2;
        double value = equation(mid);
        if (value == 0) {
            break;
        }
        else if (value > 0) {
            right = mid;
        }
        else {
            left = mid;
        }
    }

    printf("%.4lf\n", (left + right) / 2);
    return 0;
}
上一篇:国际中文教育知识图谱问答


下一篇:深入了解 Three.js 中的材质与光照-一、材质概述