【C语言基础习题】C语言练习题——bite 寒假班作业(5)

260 阅读10分钟

C语言练习题——bite 寒假班作业(5)

目录

@[TOC]

[TOC]

2024-1-23 break continue

题目

  1. 第 1 题(单选题)

题目名称: 有以下程序

#include <stdio.h> 
int main() { 
		int a = 0, b = 0; 	
		for (a = 1, b = 1; a <= 100; a++) 	{ 	
			if (b >= 20)  
				break; 	
			if (b % 3 == 1) 	1
			{ 		
				b = b + 3; 		
				continue; 	
			} 		
   		b = b-5; 
		}	 	
		printf("%d\n", a); 	
		return 0; 
} 

程序的输出结果是?( )

题目内容: A .10 B .9 C .8 D .7 在这里插入图片描述

  1. 第 2 题(单选题) 题目名称: 关于while(条件表达式) 循环体,以下叙述正确的是( )? (假设循环体里面没有break,continue,return,goto等等语句)

题目内容: A .循环体的执行次数总是比条件表达式的执行次数多一次 B .条件表达式的执行次数总是比循环体的执行次数多一次 C .条件表达式的执行次数与循环体的执行次数一样 D .条件表达式的执行次数与循环体的执行次数无关

多判断一次的 判断后不满足 就会 不进入循环体了

第 3 题(单选题) rand函数

题目名称: 关于rand函数说法错误的是?

题目内容: A .rand函数生成了0~32767之间的随机数 B .rand函数生成的是真正的随机数 【并非真正的随机,是由算法生成的】 C .rand函数在使用之前,需要调用srand函数设置随机数的生成器 D .rand函数的使用需要包含stdlib.h的头文件

rand() 随机 函数 在C语言中,rand() 函数是一个用于生成伪随机数标准库函数。 定义在 <stdlib.h> 头文件中。 rand() 函数每次被调用时,都会返回一个在 0 到 RAND_MAX 之间的伪随机数,其中 RAND_MAX 是一个常量,表示 rand() 函数能返回的最大值,其值至少为 32767。

然而,直接使用 rand() 函数生成的随机数序列是固定的,即每次程序运行时生成的随机数序列都是相同的,除非通过某种方式改变随机数生成的种子。为了生成不同的随机数序列,可以使用 srand() 函数来设置随机数生成的种子。

简单的例子:


> #include <stdio.h>  
> #include <stdlib.h>  
> #include <time.h>      int main() {  
>     // 使用当前时间作为随机数生成的种子  
>     srand((unsigned)time(NULL));  
>   
>     // 生成并打印10个随机数  
>     for (int i = 0; i < 10; i++) {  
>         printf("%d\n", rand());  
>     }  
>   
>     return 0;   }
/**
	在这个例子中,srand((unsigned)time(NULL)); 
	用于设置随机数生成的种子。
	time(NULL) 返回当前时间(从1970年1月1日以来的秒数),
	这样每次程序运行时由于时间不同,种子也就不同,
	从而生成不同的随机数序列。
**/

在这个例子中,srand((unsigned)time(NULL)); 用于设置随机数生成的种子。time(NULL) 返回当前时间(从1970年1月1日以来的秒数),这样每次程序运行时由于时间不同,种子也就不同,从而生成不同的随机数序列。注意事项

  1. 生成的随机数实际上是伪随机数,因为它们是由算法生成的,不是真正的随机。
  2. 总是应该在程序开始时(或每次需要生成新的随机数序列时)调用 srand() 函数来设置种子
  3. RAND_MAX 定义了 rand() 函数能返回的最大值,你可以使用它来限制随机数的范围。例如,如果你想要一个 0 到 99 之间的随机数,可以这样做:rand() % 100。但是要注意,如果 RAND_MAX 不是 100 的倍数,这种方法可能会稍微偏向低值(因为 RAND_MAX + 1 是 100 的倍数时才会均匀分布)。为了更均匀地分布,可以使用:(rand() * 100) / (RAND_MAX / 100 + 1)。
  4. 【跨平台要小心】不同的编译器和平台可能有不同的 RAND_MAX 值,因此跨平台编写代码时要小心。

第 4 题 猜数字游戏

题目名称: 猜数字游戏 题目内容: 完成上课的猜数字游戏

【分析】

  1. 猜数字游戏 其实类似随机数,我们需要猜大概的数字,程序提示我们是猜大了还是猜小了! 循环进行,直到才正确。

第 5 题 乘法口诀表

题目名称: 乘法口诀表 题目内容: 在屏幕上输出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;
}

【分析】 【经典重要】

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

九九乘法表,肯定需要双层循环

第 6 题 求最大值

题目名称: 求最大值 题目内容: 求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;
}

第 7 题 分数求和

题目名称: 分数求和 题目内容: 计算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;
}

第 8 题 打印素数

题目名称: 打印素数 题目内容: 写一个代码:打印100~200之间的素数 【分析】 素数,又称质数,是指 除了1和它本身之外,没有其他的数可以整除。 因此,根据概念我们,我们首先想到我们可以用2和所求的那个数之间的数字去除该数,尝试是否有其他的数可以整除。若有,则不是素数;反之,则是。 上面所描述的就是方法之一,是最容易想到的。当然,也是性能/效率最低的。

通过我们的进一步思考,是否可以继续优化算法呢? 我们知道一个数【i】要是能被另一个数【j】整数,那么肯定也能被另一个数【j】的一半整除【j/2】;因此,通过本次分析,进一步优化部分代码:

for(int i = 100; i <= 200; i++) {
	for(int j = 2; j <= i / 2; j++) {
		if(i % j == 0) 
			break;
	}
}

本次代码的优化在一定程度上是提高了效率但不多。

通过进一步的学习,我们知晓我们还可以使用平方根的方法进一步优化。具体核心实现如下:

for(int i = 100; i <= 200; i++) {
	for(int j = 2; j <= sqrt(i) * 1.0 ; j++) {
		if(i % j == 0) 
			break;
	}
}

示例代码》

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

第 9 题 打印闰年

题目名称: 打印闰年 题目内容: 打印1000年到2000年之间的闰年 【分析】 首先我们要知道闰年是什么? 闰年是怎么规定的? 闰年分为普通闰年和世纪闰年

普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。 世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。 百度百科/360百科 闰年规则/判断条件:

  • 能被4整除的,但不能被100整除的年份
  • 能被400整除的年份。

示例代码

#include <stdio.h>

/**
 *   leap year
 *
 *   output:
 *      leap year from 2000 - 2050
 * @return
 */
int main() {

    printf("the follows - leap year:\n");
    for (int year = 2000; year <= 2050; year++) {
        if (((0 == year % 4) && (0 != year % 100)) || (0 == year % 400)) {
            printf(" %d ", year);
        }
    }
    printf("\n");
    printf("Hello, World!\n");
    return 0;
}

第 10 题 最大公约数

题目名称: 最大公约数 题目内容: 给定两个数,求这两个数的最大公约数

例如: 输入:20 40 输出:20

【分析】

约数,又叫因数;是指 一个数【num】能写成两个数或几个数相乘的形式,其中那些数是【num】的因数/约数。

在小学数学里,两个正整数相乘,那么这两个数都叫做积的因数,或称为约数。

进而,公因数,想必就更好理解了。就是 给定两个整数,它们都会有因数,但也不一定都一样,但总会有一样因数的两个数,那个一样的因数,就叫做 公因数(公共的因数)

给定若干个整数,如果有一个(些)数是它们共同的因数,那么这个(些)数就叫做它们的公因数。

最后,最大公因数是什么?whatt我和他谈谈? 当然就是公因数中最大的那一个啦

而全部公因数中最大的那个,称为这些整数的最大公因数。

解决方案/判断方案

  • 辗转相除法
  • 更相减损法
  • 短除法
  • ...等等

这里我们讲解一下辗转相除法的操作原理:

  1. 首先由两个整数,我们要 求它们的最大公因数【n1,n2】
  2. 【我们这里设n1为较大的那个数】用较大的数除以较小的数得出的余数,纪委【reminder】
  3. 【辗转相除的思想就是用算出的余数继续作为除数使用】接着,我们用上一步的除数【(较小的数)n2】除以 余数【reminder】,再次到的新的余数【reminder】;
  4. 重复上面3的操作 直至余数结果为0时,我们就说最后一次的除法操作中的除数【n2】是 我们要寻找的那个最大公因数。 在这里插入图片描述

示例代码:

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


第 11 题(简答题)

题目名称: 完成上课代码练习,写一篇介绍C语言分支循环语句的博客文章 题目内容: 同学自主完成课堂代码的练习 根据上课学习的知识,总结输出一篇或者几篇讲解C语言分支和循环语句的文章 具体分几篇,同学自己规划。 提交博客链接就可以