【C语言_练习题】经典易错C语言练习题总结

“微软蓝屏”事件暴露了网络安全哪些问题?

近日,一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件,不仅成为科技领域的热点新闻,更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件,源于美国电脑安全技术公司“众击”提供的一个带有“缺陷”的软件更新,它如同一颗隐形炸弹,在全球范围内引爆,导致近850万台设备遭遇故障,横跨航空、医疗、传媒等众多关键行业,甚至造成美国超过2.3万架次航班延误,其影响之广令人震惊。面对如此大规模的系统中断,网络安全与系统稳定性的讨论再次被推上风口浪尖。如何构建更加稳固和安全的网络环境?在网络安全和系统稳定性方面我们仍面临着严峻考验。快来分享你的观点吧!不论是问题解析、建议提出还是展示你所在领域中预防类似事件的有效实践,每一篇真知灼见都是对网络安全领域的宝贵贡献。

正文

1. 【计数器|数中还有指定数字的个数】编写程序数一下 1到 100 的所有整数中出现多少个数字9

【分析】
在1-100的所有整数中有多少个数字含有9 。
9可以出现在 个位数 以及 十位数 上
出现在 个位数 19 取它的余数,余数为9 可以说明个位数含有9 19 % 10 = 9

十位数  除以10得出的商中含有9 可以判断十位数是9  90 / 10 = 9  

#include <stdio.h> 
/**  *   在1-100的所有整数中有多少个数字含有9  *   【分析 】  *      9可以出现在 个位数  以及  十位数 上  *      出现在 个位数  19 取它的余数,余数为9 可以说明个位数含有9  19 %
10 = 9   *      十位数  除以10得出的商中含有9 可以判断十位数是9  90 / 10 = 9  * @return 
*/ 
int main() {
    int count = 0, i;
    for (i = 1; i <= 100; i++) {
        if (i % 10 == 9) {
            count++;
        }
        if (i / 10 == 9) {
            count++;
        }
    }

    printf("Hello, World!  total number : %d\n", count);
    return 0; }


2.【乘法口诀表】在屏幕上输出9*9乘法口诀表

【分析】

#include <stdio.h>

/**
 *  99乘法表
 * @return
 */
int main() {

    int i, j;

    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= i; j++) {
//            printf("%d * %d = %d ", i, j, i * j);
            printf("%d * %d = %-2d ", j, i, i * j);
        }
        printf("\n");
    }

    printf("Hello, World!\n");
    return 0;
}


3. 【猜数字游戏】简单的猜数字游戏

【分析】
要求:以猜1-100之间的数字为例。
输入: 猜测的数字,eg: 66
输出:若猜大了,输出“bigger”;反之,输出“smaller”;
说明: 游戏可以无限玩耍

首先,制作出一个简单明了的菜单页面。例如:


int command;

do {

    printf("======================\n");
    printf(" Bulls and Cows \n "
           "======================"
    "please enter number 1 that means the game begins!"
           "(if u enter 0 that means out): ");
    scanf("%d", &command);

    switch (command) {
        case 1:
            game();
            break;
        case 0:
            printf("game is over!");
            break;
        default:
            printf("Error, please enter again!");
    }
} while (command);

主体实现

 srand((unsigned int) time(NULL));

    int number = rand() % 100 + 1;
    int guess = 0;
    while (1) {
        printf("please enter guess a number in [1,100]: ");
        scanf("%d", &guess);
        if (guess < number) {
            printf("smaller!\n");;
        } else if (guess > number) {
            printf("bigger!\n");
        } else {
            printf("Congratulations!\n");
            printf("This round of game is over,"
                   "and the next round of games is about to begin.\n");
            printf("======================\n");
            break;
        }
    }

汇总

#include <stdio.h>
//#include <time.h>
#include <stdlib.h>

/**
 *
 *  Bulls and Cows
 *
 *
 * @return
 */

void game();
void menu();

int main() {

    printf("Hello, World!\n");
    menu();
    return 0;
}

/**
 *  menu
 */
void menu() {

    int command;

    do {

       // printf("======================\n");
        printf(" Bulls and Cows \n "
               "======================"
        "please enter number 1 that means the game begins!"
               "(if u enter 0 that means out): ");
        scanf("%d", &command);

        switch (command) {
            case 1:
                game();
              ///  break;
            case 0:
                printf("game is over!");
                break;
            default:
                printf("Error, please enter again!");
        }
    } while (command);
}

/**
 *  rand函数
 *       <stdlib.h> 中定义的函数,用于生成伪随机数,默认情况下,它生成从 0 到 RAND_MAX 的伪随机数,其中 RAND_MAX 是一个常数,通常是 32767。
 *       int rand(void);
 *
 */
void game() {

   // srand((unsigned int) time(NULL));

    int number = rand() % 100 + 1;
    int guess = 0;
    while (1) {
        printf("please enter guess a number in [1,100]: ");
        scanf("%d", &guess);
        if (guess < number) {
            printf("smaller!\n");;
        } else if (guess > number) {
            printf("bigger!\n");
        } else {
            printf("Congratulations!\n");
            printf("This round of game is over,"
                   "and the next round of games is about to begin.\n");
            printf("======================\n");
            break;
        }
    }
}


4.【最值】求10 个整数中最大值

分析】

#include <stdio.h>

/**
 * 求10 个整数中最大值
 *  
 *  分析 
 *      逐个比较, 先把第一个当作是MAX最大值,拿它和其他人逐一比较,每次把最大值赋值给MAX
 *    从而最终选出MAX
 *    
 */
int main() {

    int arr[] = {10, 6, 9, 36, 211, 985, 666, 96, 86, 98}, max;
    for (int i = 0; i < 10; ++i) {
        max = arr[0];
        if (max <= arr[i]) {
            max = arr[i];
        }
    }

    printf("max value is %d \n", max);
    printf("Hello, World!\n");
    return 0;
}

5. 【分数求和】计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果

分析】

/*#include <stdio.h>

*//**
 *  [分数求和]
 *      计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
 *      【分析】
 *
 * @return
 *//*
int main() {

    double sum = 0.0;

    for (int i = 1; i <= 100; ++i) {
        if (i % 2 == 0) {
            i = -i;
//            printf("i= %d\n", i);
        }
        // 细节
        // sum += 1 / i;
        sum += 1.0 / i;
        if (i % 2 == 0) {
            i = -i;
//            printf("i= %d\n", i);
        }
    }
    printf("sum of point is %lf.\n", sum);
    printf("Hello, World!\n");
    return 0;
}*/


#include <stdio.h>

/**
 *  [分数求和]
 *      计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
 *      【分析】
 *
 *  【方法二】 使用 flag ,乘以 1 -1 循环变化
 **/
int main() {    
    double sum = 0.0;
    int flag = 1;
    for (int i = 1; i < 100; ++i) {

        sum += 1.0 / i * flag;
        flag = -flag;

    }

    printf("sum of point is %lf.\n", sum);
    return 0;
}

6. 【打印素数】 打印100~200之间的素数

分析】

素数,又称质数。
除了1和它本身外,不能被其他的整数整除的数。
方案/方法一: 暴力破解法
要想得知某数i 是否为素质,使用 [2,(i-1)]内的整数整除i,若能被整除则不是;反之,则是素数。
该方法实施可行,但速度较慢,效率低。
方案/方法二:巧用除以二,进行暴力破解
要想得知某数i 是否为素质,使用 [2,i/2]内的整数整除i,之所以使用[2,i/2],是因为i/2,是可以通过乘以2获得。若能被整除则不是;反之,则是素数。
同样的,该方法实施可行,速度略有提高,但依然可以优化。
方案三: 巧用平方根

方案三实现代码如下:

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

/**
 *  print prime numbers
 *   100-200
 * @return
 */
int main() {

    int count = 0, i, j;
    for (i = 100; i <= 200; ++i) {
        for (j = 2; j <= sqrt(i) * 1.0; ++j) {
//        for (j = 2; j <= sqrt(i); ++j) {
//            printf("%d \n", j);
            if (0 == i % j) {
                break;
            }
        }
        if (j > sqrt(i)) {
            count++;
            printf("%d ", i);
        }

        /*if (0 == count % 7) {
            printf("\n");
        }*/
    }
    
    printf("the number of prime number in [100,200]: %d\n", count);
    printf("Hello, World!\n");
    return 0;
}

【判断素数】

题目名称: 函数判断素数
题目内容: 实现一个函数is_prime,判断一个数是不是素数。
利用上面实现的is_prime函数,打印100到200之间的素数。

1

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

/**
 *  判断素数
 * @param num
 * @return
 */
int is_prime(int num);

int main() {
    int num;
    scanf("%d", &num);
    if(is_prime(num)) {
        printf("%d is prime \n",num);
    } else {
        printf("%d isn't prime \n",num);

    }
    return 0;
}

/**
 *  判断素数
 * @param num
 * @return  0  1
 */
int is_prime(int num) {

    int i;

    // 0 1 不是素数
    if (num < 1) {
        return 0;
    }

    int sqrt_num = (int) sqrt(num);
    for (i = 2; i <= sqrt_num; ++i) {
        if (0 == num % i) {
            return 0;
        }
    }
    return 1;
}

2

// 素数
#include <stdio.h>
#include <math.h>

/**
 *  判断素数
 * @param num
 * @return
 */
int is_prime(int num);

int main() {
    for (int i = 100; i < 200; ++i) {
        if (is_prime(i)) {
            printf("%d ", i);
        }
    }
    printf("\n");

    return 0;
}

/**
 *  判断素数
 * @param num
 * @return  0  1
 */
int is_prime(int num) {

    int i;

    // 0 1 不是素数
    if (num < 1) {
        return 0;
    }

    int sqrt_num = (int) sqrt(num);
    for (i = 2; i <= sqrt_num; ++i) {
        if (0 == num % i) {
            return 0;
        }
    }
    return 1;
}

【素数 nowcoder】BC162 牛牛的素数判断

【素数】(BC162 牛牛的素数判断)

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


int main() {
    int n, i, j, num;

    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &num);
        for (j = 2; j < sqrt(num) * 1.0; j++) {
            if (0 == num % j) {
                printf("false\n");
                break;
            }
        }
        if (j > sqrt(num)) {
            printf("true\n");
        }
    }

    return 0;
}

核心抓住,素数怎么判断

总结: 还是要心细,细心!

7. 【打印闰年】 打印1000年到2000年之间的闰年

分析】

【判断闰年 】 判断 - BC55 判断闰年

BC55 判断闰年https://www.nowcoder.com/practice/a7bcbe3cb86f435d9617dfdd20a16714?tpId=290&tqId=39843&ru=/exam/oj

描述
判断一个整数n是否是闰年
输入描述:
输入一个整数n (
1

n

2018
1≤n≤2018)
输出描述:
是闰年输出"yes" 否则输出"no"

非整数年 : 能被4整除,却不能被100整除
整数年: 能被400整除的年份

#include <stdio.h>

int main() {
    int year;

    scanf("%d",&year);

    if (0==year%4&&0!=year%100 || 0 == year%400) {
      printf("yes\n");
    } else {
        printf("no\n");
    }
   
    return 0;
}

改进/替换

#include <stdio.h>

int main() {
    int year;
    
    scanf("%d",&year);

    // if (0==year%4&&0!=year%100 || 0 == year%400) {
    //   printf("yes\n");
    // } else {
    //     printf("no\n");
    // }

    // 经过优化还可以使用条件运算符
    //  注意这里是字符串 用 双引号 "yes":"no" 
    printf(((0==year%4&& 0 != year % 100 )||( 0==year%400))?"yes":"no");
   
    return 0;
}

8. 【最大公约数】给定两个数,求这两个数的最大公约数

分析】

最大公约数是指 两个或者多个整数共有约数最大的那一个。
又称最大公因数,最大公因子 。

两个整数的最大公约数是能够同时整除它们的最大的正整数。


约数 是什么?

能够整除一个数的正整数。 【又称因数。】
整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。


相关概念:

  • 如果一个数c既是数a的因数,又是数b的因数,那么c叫做a与b的公因数。
  • 两个数的公因数中最大的一个,叫做这两个数的最大公因数。
  • 约数,也叫因数。

【解决方法】

**1. 辗转相除法** 
 			辗转相除法,又称为**欧几里得算法**。

是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。

原理:

  • 两个整数的最大公约数 等于 其中较小的数 和 两数 相除余数 的最大公约数。【(1)百度百科

具体做法/实现方式:

  1. 较大数除以较小数,得出 余数1;
  2. 上一个算式中的除数(较小的数)除以 余数1,得出余数2;
  3. 余数1 除以 余数2 ;
  4. 以上步骤,如此反复,直到余数为0为止。 那么最后的算式中的 除数 就是 这两个数的最大公约数。
    最后,将数学算法的步骤转化为程序步骤即可

《实现》

代码算法实现

#include <stdio.h>

/**
 *  【最大公因数】求两数中的最大公因数
 *
 *   【分析】
 *      因数/约数是什么
 *      最大的公因数是什么
 *
 *     【解决方法】
 *       1.辗转相除法【欧几里得算法】
 *       2. 更相减损法
 *       3. 短除法......
 *
 *
 * @return
 */
int main() {
    // 辗转相除法

    int num1 = 18, num2 = 36, remainder = num1 % num2;

    while (remainder != 0) {

        num1 = num2;
        num2 = remainder;

        remainder = num1 % num2;

    }
//    printf("The Greateset common divisor of two number is : %d\n",remainder);
    // 细节 细心;弄懂 原理
    printf("The Greateset common divisor of two number is : %d\n",num2);
    printf("Hello, World!\n");
    return 0;
}

  1. 更相减损法
  2. 短除法

9. 【交换两数】使用自定义函数进行交换两数。

分析】
用到了指针

#include <stdio.h>

/**
 *
 *  两数交换
 */

int swap(int *a, int *b);

int main() {

    int a = 211, b = 985;

    swap(&a, &b);

    printf("a = %d, b = %d \n", a, b);
    printf("Hello, World!\n");
    return 0;
}

/**
 *  交换数字
 * @param a
 * @param b
 * @return
 */
int swap(int *a, int *b) {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
    return 0;
}

10 . 【】

分析】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾贰_Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值