思维导图
for循环应用
应用一:使用累加
分数求和
要求:计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
步骤:
- 定义变量sum为0.0,用于存储最后的总和
- 定义变量flag为1,用于标识当前分数项的符号,初始化为正数
- 使用一个for循环,从i=1,逐个遍历到i=100
- 在每一次循环中,计算当前分数项的值,并将其累加到总和sum中
- 使用1.0 / 分母,是为了确保分数计算的结果为double类型
- 每次循环结束后,更新flag的值为相反数,切换下一项的符号
#include <stdio.h>
int main()
{
double sum = 0.0;
int flag = 1;
for (int i = 1; i <= 100; i++)
{
sum += 1.0 / (flag * i); //1.0 /整数,结果为double类型
flag = -flag;
}
printf("%lf", sum); //使用%lf输出double类型的数据
return 0;
}
输出结果:0.688172
应用二:使用累乘
计算 n的阶乘
思路:
- 定义一个变量product,初始化为1,用于存储总乘积的结果
- 然后通过for循环从1到n的范围内遍历,将每次遍历到的数字与product相乘,并将结果赋值给product
int main()
{
int n = 10;
int product = 1;
//循环计算乘积
for (int i = 1; i <= n; i++)
{
product = product * i;
}
printf("%d\n", product);
return 0;
}
计算 1!+ 2!+ 3!+ …… + 10!
- 通过一个外层for循环,从1到10的范围内遍历,控制每个数的阶乘求和
- 然后使用一个内层for循环,从1到i的范围内遍历,将每个数与fac累乘,并将结果赋给fac
- 最后将每个数的阶乘,累加到sum变量中
int main()
{
int sum = 0;
//外层循环控制各数阶乘求和
for (int i = 1; i <= 10; i++)
{
int fac = 1;
//内层循环控制每个数的阶乘
for (int j = 1; j <= i; j++)
{
fac *= j; //累乘
}
//求阶乘之和
sum += fac; //累加
}
printf("%d\n", sum);
return 0;
}
应用三:使用标记变量
判断一个数是否为素数
要求:写一个代码:打印100~200之间的素数i
前置知识:
- 偶数不是素数
- 如果一个数有其他因数(除1和本身外),那至少有一个小于等于其平方根sqrt(i)的因数
思路:试除法
- 用一个外层for循环,从101开始,遍历到199之间的奇数
- 设置一个标记变量isPrime,用于标识素数,初始化为素数
- 用一个内层for循环,用于判断当前数是否为素数
- 判断标准:如果一个数有其他因数(除1和本身外),那至少有一个小于等于其平方根的因数
- 如果当前数能给被除尽,即存在其他因数,并改变isPrime的值,表示不是素数,跳出内存循环
- 判断isPrime是否等于1,如果等于1,表示当前数是素数
#include <stdio.h>
#include <math.h>
int main()
{
int primeCount = 0; //统计素数个数
for (int num = 101; num <= 199; num += 2) //素数不可能为偶数
{
int isPrime = 1; //首先假设这个数是素数
//判断是否为素数
for (int divisor = 2; divisor <= sqrt(num); divisor++)
{
if (num % divisor == 0)
isPrime = 0;
}
}
//循环结束:
//情况1:遇到素数,提前结束循环
//情况2:没有遇到素数,正常结束循环
//检查标记
if (isPrime == 1) //如果等于1,说明是情况2
{
printf("%d ", num);
primeCount++;
}
}
printf("\nprimeCount:%d\n", primeCount);
return 0;
}
输出结果:
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
primeCount: 21