目录
三、计算 1/1 - 1/2 + 1/3 - 1/4 + 1/5 …… + 1/99 - 1/100 的值
在编程学习的道路上,我们常常从一些基础且常见的问题入手,通过编写代码来解决它们,从而逐渐掌握编程的基本技巧和思维方式。今天,我们就来分析一系列用 C 语言编写的基础代码,涵盖了乘法口诀表、求数组最大值、数列求和、素数判断、闰年判断以及求最大公约数等问题。
一、乘法口诀表
//乘法口诀表
#include<stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d*%d=%d ", j, i, i * j);
}
printf("\n");
}
return 0;
}
这段代码的功能是打印出九九乘法口诀表。外层循环控制行数,从 1 到 9,每一行对应一个i值。内层循环控制每行的列数,列数由j表示,且j的范围是从 1 到当前行的i值。在内层循环中,通过printf函数打印出每一个乘法表达式,格式为j*i=i*j。当内层循环结束后,通过printf("\n")换行,开始下一行的打印。这种双层循环的结构是实现乘法口诀表打印的关键,它巧妙地利用了循环变量的变化来控制输出的内容和格式。
二、求 10 个整数里面的最大值
//求10个整数里面的最大值
#include<stdio.h>
int main() {
int arr[10] = { '0' };
for (int i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < 10; i++) {
for (int j = i; j < 10; j++) {
if (arr[i] < arr[j]) {
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
这段代码的目的是从用户输入的 10 个整数中找出最大值。首先,定义一个包含 10 个元素的整数数组arr,并通过for循环使用scanf函数获取用户输入的 10 个整数存入数组中。然后,使用冒泡排序的思想,通过两层循环进行比较和交换。外层循环控制排序的轮数,内层循环用于每一轮中相邻元素的比较。如果发现arr[i]小于arr[j],则通过一个临时变量temp进行交换。这样,经过多轮比较和交换后,数组中的元素会按从大到小的顺序排列,数组的第一个元素arr[0]即为最大值。最后,通过另一个for循环将排序后的数组打印出来。不过,这种方法实际上是对整个数组进行了排序,为了仅仅找到最大值,我们可以使用更简单的方法,只需要一次遍历数组,记录下当前的最大值即可,这样可以减少时间复杂度。
三、计算 1/1 - 1/2 + 1/3 - 1/4 + 1/5 …… + 1/99 - 1/100 的值
//计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 …… + 1/99 - 1/100 的值,打印出结果
#include<stdio.h>
int main() {
float num = 0;
float a = 1;
for (int i = 1; i < 100; i++) {
if (i % 2 == 0) {
num = (1 / a) - (1 / (a + 1));
a++;
}
else {
num = (1 / a) + (1 / (a + 1));
a++;
}
}
printf("%f ", num);
return 0;
}
这段代码用于计算一个特定数列的和。数列的通项公式为(-1)^(n - 1) * (1/n),这里n从 1 到 100。代码中定义了一个浮点数变量num用于存储最终的和,初始值为 0,另一个浮点数变量a用于控制分母。在for循环中,通过判断i的奇偶性来决定是进行加法还是减法运算。当i为偶数时,执行num = (1 / a) - (1 / (a + 1)),即减去当前项;当i为奇数时,执行num = (1 / a) + (1 / (a + 1)),即加上当前项。每次运算后a自增 1,以保证分母的正确变化。循环结束后,通过printf函数打印出计算结果。然而,这段代码存在一个问题,由于整数除法的特性,1/a和1/(a + 1)在a大于 1 时会得到 0,因为这里1和a都是整数,应该将1改为1.0,使其变为浮点数除法,这样才能得到正确的小数结果。
四、打印 100~200 之间的素数
//打印100~200之间的素数
#include<stdio.h>
#include<math.h>
int main() {
for (int i = 101; i < 200; i++) {
int num = sqrt(i);
int n = 1;
for (int j = 2; j < num; j++) {
if (i % j == 0)
n = 0;
}
if (n == 1) {
printf("%d ", i);
}
n = 0;
}
return 0;
}
这段代码的功能是找出并打印 100 到 200 之间的所有素数。素数是指在大于 1 的自然数中,除了 1 和它自身外,不能被其他自然数整除的数。外层for循环从 101 开始,到 199 结束,遍历这个范围内的每一个数i。对于每个数i,先计算其平方根并赋值给num,这是为了减少内层循环的次数,因为如果一个数不是素数,那么它一定有一个小于或等于其平方根的因数。内层for循环从 2 开始,到num结束,检查i是否能被j整除。如果能整除,说明i不是素数,将标志变量n置为 0。如果内层循环结束后n仍然为 1,说明i是素数,通过printf函数将其打印出来。最后,将n重新置为 0,以便下一次判断使用。这种通过检查因数来判断素数的方法是常见且有效的,利用平方根来优化循环次数进一步提高了程序的效率。
五、打印 1000 年到 2000 年之间的闰年
//打印1000年到2000年之间的闰年
#include<stdio.h>
int main() {
for (int i = 1000; i <= 2000; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
printf("%d ", i);
}
}
return 0;
}
这段代码用于找出并打印 1000 年到 2000 年之间的所有闰年。闰年的判断规则是:能被 4 整除但不能被 100 整除的年份为闰年,此外能被 400 整除的年份也是闰年。在for循环中,遍历从 1000 到 2000 的每一个年份i。通过if语句结合闰年的判断规则,判断当前年份是否为闰年。如果满足(i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)这个条件,说明i是闰年,通过printf函数将其打印出来。这种直接根据闰年定义进行判断的方式简洁明了,准确地实现了找出指定年份范围内闰年的功能。
六、给定两个数,求这两个数的最大公约数
//给定两个数,求这两个数的最大公约数
#include<stdio.h>
int main() {
int a = 0, b = 0, c = 0;
scanf("%d %d", &a, &b);
if (a < b) {
int temp = 0;
temp = a;
a = b;
b = temp;
}
for (int i = 1; i <= b; i++) {
if (a % i == 0 && b % i == 0) {
c = i;
}
}
printf("%d ", c);
return 0;
}
这段代码用于求用户输入的两个整数的最大公约数。首先,通过scanf函数获取用户输入的两个整数a和b。然后,通过一个if语句判断a和b的大小,如果a小于b,则通过一个临时变量temp将a和b的值交换,确保a是较大的数。接下来,通过一个for循环从 1 开始,到较小的数b结束,依次检查每一个数i是否能同时整除a和b。如果能整除,说明i是a和b的公约数,将其赋值给c。由于循环是从小到大进行的,当循环结束时,c中存储的就是a和b的最大公约数。最后,通过printf函数将最大公约数打印出来。这种方法虽然简单直观,但效率较低,更高效的方法可以使用辗转相除法,通过不断用较小数对较大数取余,直到余数为 0,此时的除数就是最大公约数。
通过对这些基础代码的分析,我们可以看到,每一个看似简单的编程问题背后都蕴含着特定的算法和编程技巧。从循环结构的运用到条件判断的设计,从变量的合理定义到算法效率的优化,都是我们在编程学习过程中需要不断积累和提升的方面。希望这些代码分析能对大家的编程学习有所帮助,让我们在编程的道路上迈出更坚实的步伐。