C语言练习题——bite 寒假班作业(5)
目录
@[TOC]
[TOC]
2024-1-23 break continue
题目
- 第 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
- 第 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日以来的秒数),这样每次程序运行时由于时间不同,种子也就不同,从而生成不同的随机数序列。 【注意事项】
- 生成的随机数实际上是伪随机数,因为它们是由算法生成的,不是真正的随机。
- 总是应该在程序开始时(或每次需要生成新的随机数序列时)调用 srand() 函数来设置种子。
- RAND_MAX 定义了 rand() 函数能返回的最大值,你可以使用它来限制随机数的范围。例如,如果你想要一个 0 到 99 之间的随机数,可以这样做:rand() % 100。但是要注意,如果 RAND_MAX 不是 100 的倍数,这种方法可能会稍微偏向低值(因为 RAND_MAX + 1 是 100 的倍数时才会均匀分布)。为了更均匀地分布,可以使用:(rand() * 100) / (RAND_MAX / 100 + 1)。
- 【跨平台要小心】不同的编译器和平台可能有不同的 RAND_MAX 值,因此跨平台编写代码时要小心。
第 4 题 猜数字游戏
题目名称: 猜数字游戏 题目内容: 完成上课的猜数字游戏
【分析】
- 猜数字游戏 其实类似随机数,我们需要猜大概的数字,程序提示我们是猜大了还是猜小了! 循环进行,直到才正确。
第 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我和他谈谈? 当然就是公因数中最大的那一个啦
而全部公因数中最大的那个,称为这些整数的最大公因数。
解决方案/判断方案
- 辗转相除法
- 更相减损法
- 短除法
- ...等等
这里我们讲解一下辗转相除法的操作原理:
- 首先由两个整数,我们要 求它们的最大公因数【n1,n2】
- 【我们这里设n1为较大的那个数】用较大的数除以较小的数得出的余数,纪委【reminder】
- 【辗转相除的思想就是用算出的余数继续作为除数使用】接着,我们用上一步的除数【(较小的数)n2】除以 余数【reminder】,再次到的新的余数【reminder】;
- 重复上面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语言分支和循环语句的文章 具体分几篇,同学自己规划。 提交博客链接就可以