3.循环结构

p51求表达式的和

题目 S=1+2+3+4+...+n

输入 整数n

输出 整数S

#include <stdio.h>
 int main() {
     int n, s = 0;
     scanf("%d", &n);
     for (int t = 1; t <= n; t++) {
         s = t + s;
     }
     printf("%d", s);
 }

p52求分数和

题目 S=1+1/2+1/3+...+1/n

输入 整数n

输出 实数S(保留三位小数)

#include <stdio.h>
 int main() {
     int n;
     double s = 0.0, m;
     scanf("%d", &n);
     for (int t = 1; t <= n; t++) {
         s = s + 1 / (t * 1.0);  // 记得t要乘1.0,将整型转化浮点型
     }
     printf("%.3lf", s);  // 保留三位小数
 }

p53三位回文数

题目 从小到大输出[m,n]之间的所有回文数,并求这些数有多少个

输入 两个整数 m和n用空格隔开(m<=n,且m.n一定都是 3 位数)

输出 先输出m,n之间所有的 3 位的回文数,每行 1 个;最后 1 行输出 3 位回文数总共有多少个

#include <stdio.h>
 int main() {
     int m, n, a, b, p = 0;
     scanf("%d %d", &m, &n);
     for (int t = m; t <= n; t++){  // t应该从m开始
         a = t / 100;  // 位于百位的数字
         b = t % 10;   // 位于个位的数字
         if (a == b) {
             p = p + 1;  // p表示回文数的个数
             printf("%d\n", t); // 记住换行
         }
     }
     printf("%d", p);
     return 0;
 }

p54回文数个数

输入 正整数n

输出 一个正整数,表示[1,n]之间的回文数个数

#include <stdio.h>
 int main() {
     int i, a, b, c, num = 0;
     scanf("%d", &a);
     for (i = 1; i <= a; i++) {
         b = i;  // 保留原有i的值
         int d = 0;
         while (b != 0) {
             c = b % 10;
             d = d * 10 + c;
             b /= 10;  // 得到的d就是b的倒置数
         }
         if (d == i)  // 若成立则a是回文数
             num++;   // 回文个数加一
     }
     printf("%d", num);
     return 0;
 }

p55打分

题目 有n(n≤1000) 位评委打分,分值从 0 到 10,需要去一个最高分,去一个最低分(如果有多个最高或者最低分,也只需要去掉一个),剩下的评分的平均数就是这位选手的得分

输入

第一行输入一个正整数 n,表示有 n 个评委。

第二行输入n个正整数,第个正i整数表示第 i个评委打出的分值。

输出 最后得分(保留两位小数)

#include <stdio.h>
 int main() {
     int n, max = -2e9, min = 2e9;  // 赋初值,保证max,min一定会被更新
     int x, sum = 0, sum1;
     double p;  // 注意后面得分是小数
     scanf("%d", &n);
     for (int i = 0; i <= (n - 1); i++) {
         scanf("%d", &x);
         sum = sum + x;
         if (x > max) max = x;  // 得到最大值
         if (x < min) min = x;  // 得到最小值
     }
     sum1 = sum - max - min;
     p = 1.0 * sum1 / (n - 2);  // 要乘1.0,由整型化成浮点型
     printf("%.2lf", p);        // 保留两位小数
     return 0;
 }

p56整除问题

题目 输入三个正整数 min、max 和 factor,然后对于 min 到 max 之间的每一个整数(包括 min 和 max ),如果它能被 factor 整除,就把它打印出来

输入 一行,包括三个整数 min、max和factor

输出 一行,包括若干个整数(空格隔开)

#include <stdio.h>
 int main() {
     int min, max, factor;
     scanf("%d %d %d", &min, &max, &factor);
     for (int t = min; t <= max; t++) {  // t从min到max
         if (t % factor == 0) {          // 即t能被factor整除
             printf("%d ", t);
         }
     }
     return 0;
 }

p57鸡兔同笼问题

题目 一个笼子里面有鸡若干只,兔若干只,共有头n个,共有腿 m 条。求鸡兔各多少只?

输入 一行两个整数 n*,*m

输出 一行两个整数,表示鸡兔的只数,中间空格隔开

#include <stdio.h>
 int main() {
     int m, n, j, t;
     scanf("%d %d", &m, &n);
     for (t = 0; t <= m; t++) {  // 先兔的数量的循环
         j = m - t;              // 由鸡+兔=头从而求出鸡的表达式
         if (t * 4 + j * 2 == n) {
             printf("%d %d", j, t);
             break;
         }
     }
     return 0;
 }

p58角谷猜想

题目 任给一个自然数,若为偶数则除以 2,若为奇数则乘 3 加 1,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为 1。请编写代码验证该猜想:求经过多少次运算可得到自然数 1。

输入 一个正整数n

输出 一个整数,表示运算次数

#include <stdio.h>
 int main() {
     int n, t = 0; scanf("%d", &n);
     while (n > 1) {
         if (n % 2 == 0) {  // 先判断奇偶
             n = n / 2;     // 如果是偶数
         } else {           // 如果是奇数
             n = n * 3 + 1;
         }
         t = t + 1;         // t表示运算次数
     }
     printf("%d", t);
 }

p59猴子吃桃

题目 一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n 天早上起来一看,只剩下 1个桃子了。请问小猴买了几个桃子?

输入 一个正整数 n,表示天数

输出 一个整数,表示小猴买了多少个桃子

#include <stdio.h>
 int main() {
     int n, x1 = 1; scanf("%d", &n);
     while (n > 1) {         // 最后一天只有一个,n>1;
         x1 = (x1 + 1) * 2;  // 前一天加一个苹果再乘2等于今天的苹果数
         n --;
     }
     printf("%d", x1);
     return 0;
 }

p60求最大公约数

题目 求两个自然数 a,b的最大公约数(a,b 都在长整型范围内)

输入 一行,包括两个整数

输出 只有一行,包括 11 个整数

#include <stdio.h>
 int main() {
     long long a, b;  // 用int 也可以
     int n;
     scanf("%lld %lld", &a, &b);  // long long 的占位符%lld
     while (a != b) {
         if (a > b) {  // 判断大小
             a -= b;
         } else {
             b -= a;
         }
     }
     n = a;
     printf("%d", n);
     return 0;
 }

p67七仙女

题目 如果一个数是7的倍数,七仙女喜欢,如果一个数至少有一位含有数值7(例如71虽然不是7的倍数,但它的十位数是7),则七仙女也喜欢。所以7、14,71,117,都是七仙女喜欢的数

输入

第一行一个正整数n,表示共有n个数

接下来一行,n个正整数,表示需要统计的n个数

输出 一行一个数,表示七仙女喜欢的数的个数

#include <stdio.h>
 int main() {
     int n, p1 = 0, p2 = 0;
     scanf("%d\n", &n);
     for (int t = 1; t <= n; t++) {
         long long m;
         scanf("%lld ", &m);  // 注意long long 对应的占位符
         if (m % 7 == 0) {
             p1 = p1 + 1;  // 第一种情况m是7的倍数
         } else {
             while (m >= 7) {
                 if (m % 10 == 7) {  // 第二种情况m不是7的倍数,但含有7
                     p2 = p2 + 1;
                     break;
                 } else {
                     m = m / 10;
                 }
             }
         }
     }
     printf("%d", p1 + p2);  // 两种情况相加
     return 0;
 }

p68计数问题

题目 计算在区间 1 到n 的所有整数中,数字x(0≤x≤9)共出现了多少次?

输入 2 个整数n,x,用一个空格隔开

输出 1 个整数,表示x出现的次数

#include <stdio.h>
 int main() {
     int n, x, t, t1, p = 0;
     scanf("%d %d", &n, &x);
     if (n >= x) {  // 如果n<x,则次数为0
         for (t = 1; t <= n; t++) {
             t1 = t;                  // 保留原来t的值
             while (t1) {             // 条件就是t1!=0
                 if (t1 % 10 == x) {  // 此时t1的个位数为x
                     p = p + 1;
                 }
                 t1 = t1 / 10;
             }
         }
     }
     printf("%d", p);
     return 0;
 }

p70回文数

题目 对任意给出的一个整数n,经过一系列的处理(该数加上它的颠倒数),最后都变成回文数

输入 一个整数(n>=1&&n<=1000000)

输出 使n变成回文数最少处理次数

#include <stdio.h>
 int main() {
     long long n, p = 0, b, a1;  // 用long long
     scanf("%lld", &n);          // long long 对应的占位符
     while (1) {                 // 可一直循环,死循环
         b = 0, a1 = n;
         while (a1) {
             b = b * 10 + a1 % 10;
             a1 /= 10;       // b是a的颠倒数
         }
         if (n == b) break;  // 中断循环
         else {
             n = n + b;
             p++;
         }
     }
     printf("%lld", p);
     return 0;
 }

p79数字和

题目 某合数的各位数字之和等于它所有质因数的各数字之和,你帮助桐桐把n以内(包括n)具有上述特点的所有合数找出来好吗?

输入 一个整数n

输出 若干行,每行输出5个满足条件的数

#include <stdio.h>
 int main() {
     int n, cnt = 0; scanf("%d", &n);
     for (int i = 1;i <= n; i++) {
         int f = 1; // 假设 i 是素数
         for (int j = 2; j <= i / j; j++)
             if (i % j == 0) { f = 0; break; }
         if (f == 0) {  // i为 合数
             int t = i, a = 0, b = 0;
             // a 表示合数的各位数字之和
             // b 表示所有质因数的各数字之和
             while (t) { a += t % 10, t /= 10; }
             t = i;
             for (int j = 2; j <= i; j++) {
                 while (t % j == 0) {
                     t /= j;
                     int tt = j;
                     while (tt) { b += tt % 10, tt /= 10; }
                 }
             }
             if (a == b) {
                 printf("%d ", i);
                 cnt++; // 记录输出个数,每 5个换行
                 if (cnt % 5 == 0) puts("");
             }
         }
     }
     return 0;
 }

p86多项式求和

题目 输入一个正整数n,求1!−2!+3!−4!+……+n! 的结果

输入 一个正整数你

输出 一个整数,运算结果

#include <stdio.h>
 int main() {
     int n, i, a = 1;
     int sn = 0;
     scanf("%d", &n);
     for (i = 1; i <= n; i++) {
         a *= i;
         if (i % 2 == 0) {  // 判断是否为偶数
             sn -= a;       // 偶数阶乘是负的
         } else {
             sn += a;
         }  // 奇数阶乘是正的
     }
     printf("%d", sn);
     return 0;
 }

p94不定方程求解

题目 给定正整数a,b,c,求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数

输入 一行,包含三个正整数a,b,c,每个数均不大于1000(空格隔开)

输出 一个整数,不定方程的非负整数解组数

#include <stdio.h>
 int main() {
     int a, b, c, x, p = 0, y;
     scanf("%d %d %d", &a, &b, &c);
     for (x = 0; x <= 1000; x++) {  // 题目中x<=1000
         y = (c - a * x) / b;  // y是整型,若从浮点型转化为整型,精度会缺失
         if (a * x + b * y == c && y >= 0) {
             p = p + 1;
         }
     }
     printf("%d", p);
     return 0;
 }

p96菲波那契数

题目 菲波那契数列是指数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数k,要求菲波那契数列中第k个数是多少

输入 一行,包含一个正整数k(1 ≤ k ≤ 46)

输出 一行,包含一个正整数,表示菲波那契数列中第k个数的大小

#include <stdio.h>
 int main() {
     int k, a = 1, b = 1, c = 2;
     scanf("%d", &k);
     for (int t = 1; t <= k - 3; t++) {  // 是少了3次
         a = b;                          // 顺序不能反
         b = c;
         c = a + b;  // 都往后移动一个
     }
     printf("%d", c);
     return 0;
 }

p97分解质因数

题目 把一个合数分解成若干个质因数乘积的形式(即求质因数的过程)叫做分解质因数(只针对合数)输入一个正整数n,将n分解成质因数乘积的形式

输入 一个正整数n

输出 分解成质因数乘积的形式,质因数必须由小到大

#include <stdio.h>
 int main() {
     int n, i = 2;  // i从2开始
     scanf("%d", &n);
     printf("%d=", n);  // 输出表达式的一边
     do {
         while (n % i == 0) {  // i是否是n 的因数
             printf("%d", i);
             n = n / i;
             if (n != 1) {
                 printf("*");
             }  // 不要忘记*
         }
         i++;
     } while (n != 1);
     return 0;
 }

p98质因数分解

题目 已知正整数n是两个不同的质数的乘积,试求出较大的那个质数

输入 只有一行,包含一个正整数 n

输出 只有一行,包含一个正整数 p,即较大的那个质数

#include <stdio.h>
 int main() {
     int n;
     scanf("%d", &n);
     for (int i = 2; i <= n; i++)  // 从2开始
         if (n % i == 0) {
             printf("%d", n / i);
             break;
         }
     return 0;
 }

p100牛顿迭代法

题目 求根号n,牛顿迭代的基本想法是:先假定一个解x0=n,那么可以得到另外一个解x1=n/x0,其中 x0*x1=n。

再取两个解的平均值作为新解,再按照同样的方式继续推导满足误差的解.

于是得到迭代公式:x=(x+n/x)/2

输入 一个实数n

输出 n,结果保留三位小数

#include <math.h>  //fabs()函数在其中
 #include <stdio.h>
 int main() {
     double n;
     scanf("%lf", &n);
     double x = n;
     while (fabs(x - n / x) > 1e-5) {  // fabs(x-n/x)是求(x-n/x)的绝对值
         x = (x + n / x) / 2;
     }
     printf("%.3lf\n", x);  // 保留三位小数
     return 0;
 }