第四章 循环结构的程序设计
#includeint main() { int n; scanf("%d", &n); //从标准输入读取n int sum = 0, v; //v:某一阶乘项的值 for(int i = 1; i <= n; ++i) //遍历1到n { v = 1; //初始化v为1 for (int j = 1; j <= i; ++j) //计算i的阶乘 v *= j; sum += v; //将i的阶乘加到sum } printf("%d", sum); //输出阶乘的和 return 0; }
#includeint main() { int n; scanf("%d", &n); //从标准输入读取n for(int i = 1; i <= n; ++i) //遍历1到n { for(int j = 1; j <= i; ++j) //在每一行输出i个'*' printf("*"); printf("\n"); //每一行结束后换行 } return 0; }
#includeint main() { int a, b, c; //分别代表公鸡、母鸡和小鸡的数量 for(a = 0; a <= 20; ++a) //公鸡最多不超过20只 for(b = 0; b <= 33; ++b) //母鸡最多不超过33只 for(c = 0; c <= 100; ++c) //小鸡最多不超过100只 { if(a+b+c == 100 && c%3 == 0 && 5*a+3*b+c/3 == 100) //满足总数量为100,小鸡数量是3的倍数,以及总钱数为100的条件 printf("%d %d %d\n", a, b, c); //输出符合条件的公鸡、母鸡和小鸡的数量 } return 0; }
#includeint main() { int a, b, c; //分别代表百位、十位和个位 for(int i = 100; i <= 999; ++i) //遍历所有三位数 { a = i/100; //计算百位数 b = i/10%10; //计算十位数 c = i%10; //计算个位数 if(a*a*a+b*b*b+c*c*c == i) //如果这个数是水仙花数 printf("%d\n", i); //输出这个数 } return 0; }
#include#include //为了使用sqrt函数 int main() { int a, b; //输入的范围[a, b] bool isPrime; //判断一个数是否为素数的标志 scanf("%d %d", &a, &b); //从标准输入读取范围[a, b] for(int i = a; i <= b; ++i) //遍历范围[a, b]内的所有数 { isPrime = true; //假设i是素数 for(int j = 2; j <= sqrt(i); ++j) //检查i是否有2到sqrt(i)的因数 { if(i % j == 0) //如果i能被j整除,说明i不是素数 { isPrime = false; //将isPrime设置为false break; //结束内层循环 } } if(isPrime) //如果i是素数 printf("%d\n", i); //输出i } return 0; }
#include#include // 为了使用sqrt函数 int main() { int d, num; // d用来保存开方后的整数,num用来保存生成的四位数 for(int i = 1; i <= 9; ++i) // 遍历所有可能的千位和百位数字 for(int j = 0; j <= 9; ++j) // 遍历所有可能的十位和个位数字 { num = i*1000+i*100+j*10+j; // 生成满足条件的四位数 d = sqrt(num); // 计算这个四位数的平方根,结果向下取整 if(num == d*d) // 如果这个四位数是某个整数的平方 printf("%d\n", num); // 输出这个四位数 } return 0; }
#includeint main() { int n, i = 2; scanf("%d", &n); // 从标准输入读取一个正整数n printf("%d=", n); // 输出n= int isFirst = 1; // 用于标记是否为第一个输出的质因数 while(n > 1) { if(n % i == 0) // 如果n能被i整除,那么i就是n的一个质因数 { if(isFirst) // 如果是第一个输出的质因数 isFirst = 0; // 将isFirst设置为0,表示后面的质因数不再是第一个 else // 如果不是第一个输出的质因数,那么在质因数前面输出一个* printf("*"); printf("%d", i); // 输出质因数i n /= i; // 用n除以i,得到剩余需要进行质因数分解的部分 } else i++; // 如果n不能被i整除,那么将i加1,尝试下一个可能的质因数 } return 0; }
#include#define M 1000000 // 设置一个常数M int main() { int n, num = 1, sum = 0; // num用于计算阶乘,sum用于存储阶乘和 scanf("%d", &n); // 从标准输入读取一个正整数n for(int i = 1; i <= n; ++i) // 从1到n逐个计算阶乘并加到sum中 { num = num * i % M; // 计算i的阶乘并取模M,避免溢出 sum = (sum + num) % M; // 将num加到sum中并取模M,避免溢出 } printf("%d", sum); // 输出阶乘和模M的结果 return 0; }
#includeint main() { int n; scanf("%d", &n); // 从标准输入读取一个正整数n int sum = 0, v; // sum用于存储阶乘和,v用于计算每个阶乘项的值 for(int i = 1; i <= n; ++i) // 从1到n逐个计算阶乘并加到sum中 { v = 1; // 初始化v为1 for (int j = 1; j <= i; ++j) // 计算i的阶乘 v *= j; sum += v; // 将v加到sum中 } printf("%d", sum); // 输出阶乘和 return 0; }
#includeint main() { int n; scanf("%d", &n); // 从标准输入读取一个正整数n double sum = 1, v; // sum用于存储倒阶乘和,v用于计算每个倒阶乘项的值 for(int i = 1; i <= n; ++i) // 从1到n逐个计算倒阶乘并加到sum中 { v = 1; // 初始化v为1 for(int j = 1; j <= i; ++j) // 计算1 / i! v *= 1.0 / j; sum += v; // 将v加到sum中 } printf("%.10lf", sum); // 输出倒阶乘和,保留10位小数 return 0; }
#include#include int main() { double x, n, s = 1; // x是实数,n是正整数,s用于存储幂的和 scanf("%lf%lf", &x, &n); // 从标准输入读取x和n for(int i = 1; i <= n; ++i) // 计算x的1到n次幂,并加到s中 s += pow(x, i); printf("%.2lf", s); // 输出幂的和,保留2位小数 return 0; }
#include#include bool isRel7(int n) // 判断数n是否与7相关 { if(n % 7 == 0) // 如果n是7的整数倍,则相关 return true; for(int a = n; a > 0; a /= 10) // 分离数字n的各位 { int d = a % 10; if(d == 7) // 如果有一位是7 return true; } return false; } int main() { int n, s = 0; scanf("%d", &n); // 从标准输入读取一个正整数n for(int i = 1; i <= n; ++i) // 从1到n逐个检查每个数 { if(isRel7(i) == false) // 如果i与7无关 s += i * i; // 将i的平方加入和s中 } printf("%d", s); // 输出平方和 return 0; }
#includeint count1(int n) // 计算数字n中1的个数 { int ct = 0; // 计数器 for(int a = n; a > 0; a /= 10) // 遍历数字n的每一位 { if(a % 10 == 1) // 如果当前位是1 ct++; // 计数器加1 } return ct; // 返回1的个数 } int main() { int n, ct = 0; // ct: 计数器 scanf("%d", &n); // 从标准输入读取一个正整数n for(int i = 1; i <= n; ++i) // 统计1到n中1的个数 ct += count1(i); printf("%d\n", ct); // 输出1的总个数 return 0; }
#includeint count2(int n) // 计算数字n中2的个数 { int ct = 0; // 计数器 for(int a = n; a > 0; a /= 10) // 遍历数字n的每一位 { if(a % 10 == 2) // 如果当前位是2 ct++; // 计数器加1 } return ct; // 返回2的个数 } int main() { int l, r, ct = 0; // ct: 计数器 scanf("%d %d", &l, &r); // 从标准输入读取两个正整数l和r for(int i = l; i <= r; ++i) // 统计l到r中2的个数 ct += count2(i); printf("%d\n", ct); // 输出2的总个数 return 0; }
#includeint main() { int h, w, x; // h: 高度, w: 宽度, x: 0表示空心, 1表示实心 char c; // 构成矩形的字符 scanf("%d %d %c %d", &h, &w, &c, &x); // 从标准输入读取高度, 宽度, 字符和标志变量 char c_in = x == 1 ? c : ' '; // 如果标志变量为1, 则内部字符为c, 否则为空格 for(int i = 0; i < w; ++i) // 打印第一行 putchar(c); putchar('\n'); for(int i = 0; i < h - 2; ++i) // 打印中间的行 { putchar(c); // 打印每行的第一个字符 for(int j = 0; j < w - 2; ++j) // 打印每行的内部字符 putchar(c_in); printf("%c\n", c); // 打印每行的最后一个字符 } for(int i = 0; i < w; ++i) // 打印最后一行 putchar(c); putchar('\n'); return 0; }
#include#include int main() { int n; // 输入的数 scanf("%d", &n); // 从标准输入读取一个数 for(int i = 2; i <= sqrt(n); ++i) // 从2开始到这个数的平方根查找因数 { if(n % i == 0) // 如果这个数能被i整除,那么i就是这个数的一个因数 { printf("%d\n", n / i); // 输出这个数除以i的结果,这就是这个数的最大质因数 return 0; } } return 0; }
#include#include #include // 判断a是否是质数,已知a >= 2 bool isPrime(int a) { for(int i = 2; i <= sqrt(a); i++) { if(a % i == 0) return false; } return true; } int main() { int n, ct = 0; // n: 输入的数, ct: 计数器 scanf("%d", &n); // 从标准输入读取一个数 for(int i = 2; ; ++i) // 从2开始 { if(isPrime(i)) // 判断i是否是质数 { ct++; // 如果是质数,计数器加1 if(ct >= n) // 如果已经找到第n小的质数 { printf("%d\n", i); // 输出这个质数 return 0; } } } }
#includeint main() { int n; scanf("%d", &n); // 读取输入的天数 int sum = 0, d = 1, j = 1; // sum: 总金币数, d: 当前阶段, j: 当前阶段的第几天 for(int i = 1; i <= n; ++i) // i: 从开始算起的第几天 { sum += d; // 当前处于阶段d,第i天获得d个金币 if(j >= d) // 若在当前阶段已经过了d天 { d++; // 阶段数增加1 j = 1; // 下一天是新的阶段的第一天 } else j++; // 处于本阶段的天数增加 } printf("%d\n", sum); // 输出总金币数 return 0; }
#includeint main() { int a, b, c, ct = 0; // ct: 计数器,用于记录解的个数 scanf("%d %d %d", &a, &b, &c); // 从标准输入读取a, b, c的值 for(int x = 0; x <= c; ++x) // 遍历x的所有可能值 for(int y = 0; y <= c; ++y) // 对于每个x,遍历y的所有可能值 { if(a*x + b*y == c) // 如果找到一组解 ct++; // 计数器加1 } printf("%d\n", ct); // 输出解的个数 return 0; }