0
点赞
收藏
分享

微信扫一扫

循环 — 你必须要会的十五道编程题

棒锤_45f2 2022-04-03 阅读 75

目录

前言:

        本讲习题来自谭老先生的《C程序设计》

        对于这些题目进行了细致的讲解,

        以求带你掌握循环的知识。                                                               

★博文转载请注明出处。

1. 请补充例5. 7程序,分别统计当“fabs(t)>= 1e- 6”和“fabs(t)> =1e-8”时执行循环体的次数。

2. 输人两个正整数m和n,求其最大公约数和最小公倍数

3. 输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数

4. 求S_n=a+aa+aaa+...+aa……aa 之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:2+22+222+2222+22222 (此时n=5)

5.  求1!+2!+3!+4!+...+20!

6. 求阶乘的和

7.  输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1+5+3。

8.  一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1,2,3

9.  有一个分数序列,求出这个数列的前20项之和

10.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

11. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。

12. 用牛顿迭代法求下面方程在1.5附近的根:2x^3- 4x^2 + 3x - 6= 0

13. 用二分法求上一题方程在(-10,10)的根:

14. 输出以下图案:

15. 两个乒乓球队进行比赛,各出3人。甲队为A,B,C 3人,乙队为X,Y,Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。

后记:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                               ——By 作者:德塔


前言:

        本讲习题来自谭老先生的《C程序设计》

        对于这些题目进行了细致的讲解,

        以求带你掌握循环的知识。                                                               

★博文转载请注明出处。


1. 请补充例5. 7程序,分别统计当“fabs(t)>= 1e- 6”和“fabs(t)> =1e-8”时执行循环体的次数。

例中程序如下:

#include<stdio.h>
#include<math.h>

int main()
{
    int sign = 1;
    double pi = 0.1,n = 1.0,term = 1.0;//term代表当前项的值

    while(fabs(term) >= 1e-6)
    {
        pi = pi + term;
        n = n + 2;
        sign = -sign;
        term = sign/n;
    }

    pi = pi * 4;
    printf("pi = %10.8f\n",pi);
    return 0;
}

 现在要我们统计循环执行的次数,只需要加一个变量count,在循环中随着循环进行++操作计数,最后打印即可

#include<stdio.h>
#include<math.h>

int main()
{
    int sign = 1;
    double pi = 0.1,n = 1.0,term = 1.0;//term代表当前项的值
    int count = 0;

    while(fabs(term) >= 1e-6)
    {
        pi = pi + term;
        n = n + 2;
        sign = -sign;
        term = sign / n;
        count++;
    }

    pi = pi * 4;
    printf("pi = %10.8f\n",pi);
    printf("count = %d\n",count);
    return 0;
}

又说要求fabs(t)> =1e-8时循环次数,这时只需要把1e - 6改成1e - 8即可


2. 输人两个正整数m和n,求其最大公约数和最小公倍数

#include <stdio.h>
int main()
{
int p, r, n, m;
printf("请输入两个正整数n,m:");
scanf("%d%d,", &n, &m);

//选出较大值,保存在n当中
if (n < m)
{
    int tmp = n;
    n = m;
    m = temp;
} 
//p是为了保存两者乘积,因为在辗转相除的时候,n*m会变化
int p = n * m;

//辗转相除
while (m != 0)
{
    r = n % m;
    //为下一次循环做准备
    n = m;
    m = r;
} 
printf("它们的最大公约数为:%d\n", n);
printf("它们的最小公倍数为:%d\n", p / n);
return 0;
}

3. 输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的
个数

  1. 需要从标准输入当中获取一行字符,我们需要对每一个字符进行甄别,判断其是英文字母还是空格,数字,其它字符

  2. 用getchar函数,可以从标准输入当中获取一个字符;当标准输入输入了多个字符的时候,getchar函数就会从缓冲区当中读取字符(我们可以输入多个字符,然后用getchar函数循环读取),当我们输入一行字符串的时候,字符串尾部是 \n,此时可以利用它来终止循环

  3. 统计

    根据字符在ASC码表上的顺序判断
int main()
{

//定义eng_char为英文字母的个数,初始值为0
//定义space_char为空格字符的个数,初始值为0
//定义digit_char为数字字符的个数,初始值为0
//定义other_char为其他字符的个数,初始值为0
int eng_char = 0, space_char = 0, digit_char = 0, other_char = 0;
printf("请输入一行字符:");

//c是从标准输入当中获取的
char c;
//如果字符不等于\n,就意味着还没有读完
while ((c = getchar()) != '\n')
{
    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
    {
        eng_char++;
    } 
    else if (c == ' ')
    {
        space_char++;
    } 
    else if (c >= '0' && c <= '9')
    {
        digit_char++;
    } 
    else
    {
        other_char++;
    }
} 
printf("英文字母数量:%d\n空格数量:%d\n数字数量:%d\n其他字符数量:%d\n", 
eng_char,space_char, digit_char, other_char);
return 0;
}


4. 求S_n=a+aa+aaa+...+aa……aa 之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:2+22+222+2222+22222 (此时n=5)


 

#include <stdio.h>
#include <math.h>

int main()
{
//n为a的个数
int n;
double a, signle_num = 0.0, total_sum = 0.0;
printf("请输入a的值以及n的值: ");
scanf("%lf %d", &a, &n);
//循环n次求总和
for (int i = 0; i < n; i++)
{
    signle_num += a * pow(10, i);//这里就是每一项数的值
    total_sum += signle_num;//每一项相加
}
printf("总和为:%lf\n", total_sum);
return 0;
}

5.  求1!+2!+3!+4!+...+20!

#
include<stdio.h>
int main()
{
double total_sum = 0。0;
    for(int i = 1; i <= 20; i++)
    {
        double single_sum = 1;
        //for循环求每一个数字的阶乘
        for (int j = i; j > 0; j--)
        {
            single_sum *= j;
        } 
        total_sum += single_sum;
    } 
printf("1~20每个数字阶乘总和为:%lf\n",total_sum);
return 0;
}

6. 求阶乘的和


#include <stdio.h>
int main()
{
double total_sum = 0, sum1 = 0, sum2 = 0, sum3 = 0.0;
    for (int k = 1; k <= 100; k++)
    {
        sum1 += k;
        //遍历50次就不再执行情况2
        if (k <= 50)
        {
            sum2 += k * k;
        } 
        //遍历10次就不再执行情况3
        if (k <= 10)
        {
            sum3 += 1.0 / k;
        }
    } 
total_sum = sum1 + sum2 + sum3;
printf("三种情况求和结果为:%lf\n", total_sum);
return 0;
}

7.  输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字
立方和等于该数本身。例如,153是水仙花数,因为153=1+5+3。


8.  一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1,2,3

 

 代码如下:

9.  有一个分数序列,求出这个数列的前20项之和

2/1  3/2  5/3  8/5  13/8  21/13  ……

规律:下一个分式当中的分子为上一个分式中分子和分母的和,分母为上一个分式的分子
还有一个需要注意的点是:保存数据的时候使用浮点数


10.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

 源代码如下:

#include <stdio.h>
int main()
{
//总高度
double total_m = 100.0;
//小球经历的米数
double total_sum = 0.0;
for (int i = 0; i < 10; i++)
{
total_sum += total_m;
total_m /= 2;
total_sum += total_m;
} 
//不需要计算第10次的反弹高度,所以减去
total_sum -= total_m;
printf("小球总共经历%lf米, 第10次反弹%lf米\n", total_sum, total_m);
return 0;
}

11. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。


12. 用牛顿迭代法求下面方程在1.5附近的根:2x^3- 4x^2 + 3x - 6= 0

#include <stdio.h>
#include <math.h>
int main()
{
    double x1, x0, f, f1;
    x1 = 1.5;
do
{
    x0 = x1;
    f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
    f1 = (6 * x0 - 8) * x0 + 3;
    x1 = x0 - f / f1;
} while(fabs(x1 - x0) >= 1e-5);

printf("方程在1.5附近的根为:%lf\n", x1);
return 0;



13. 用二分法求上一题方程在(-10,10)的根:


 


14. 输出以下图案:


15. 两个乒乓球队进行比赛,各出3人。甲队为A,B,C 3人,乙队为X,Y,Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。


后记:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                               ——By 作者:德塔

举报

相关推荐

0 条评论