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

article/2025/8/22 22:42:34

目录

前言:

        本讲习题来自谭老先生的《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即可

解答这道题时要求要知道5.7这个程序在说什么(就是求Π的值),也要知道fabs这个函数就是用来求绝对值的(不要忘了它的头文件哦!)以及科学计数法的表达形式


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

在解答这道题之前要知道最大公约数和最小公倍数之间的性质:两个自然数的乘积等于这两个自然数的最大公约数和最小公倍数的乘积。所以,当我们求出最大公约数,就可以很轻松的求出最小公倍数。
该题题目直接使用“辗转相除法”来求解最大公约数,以除数和余数反复做除法运算,当余数为 0 时,就取得当前算式中的除数为最大公约数。
eg:77   28

        77%28 = 2……21

        28%21=1……7

        21%7=3……0

此时算是中的除数7就是最大公约数了

最小公倍数:两个自然数的乘积 = 最大公约数 * 最小公倍数

代码步骤:

  • 从标准输入当中获取两个数字
  • 区分两个正整数当中的较大值(较大值 % 较小值)
  • 辗转相除法 ——> 最大公约数
  • 两数乘积 / 最大公约数 = 最小公倍数
  • 输出
#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)


 

该题目可以将数字拆分为 a * 10^n + 前一个数字 ,例如:
2 = 2 * 10^0 + 0 : 默认2的前一个数字为0,也就是没有任何值
22 = 2 * 10^1 + 2 : 22的前一个数字为2
222 = 2*10^2 + 22 :222的前一个数字为22

以此类推...
所以,在每次循环的时候,需要保存下,上一次结果的值,方便下一次计算
还需要使用到C库当中使用的pow函数,来计算某个数的n次方,我们在该题目当中使用的是10的n次方,n随着循环的次数,以此递增。

#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!

该题需要从1循环到20,依次求出每一个数字阶乘的结果。所以在代码当中需要有两个循环,大循环从1到20,保证1到20个数字都被循环到,小循环里计算N阶乘,累加求和。

注意:对于20的阶乘已经超出了 int 类型能过表示的数字范围,所以在代码当中使用 double 类型

  1. 遍历获取每一个数字
  2. 对于每一个数字进行阶乘
  3. 对于每一个数字阶乘的结果进行求和
#
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. 求阶乘的和

 综上所述:求和结果不是整数,所以定义求和变量是需要定义为带有精度的变量 double
该题目,最大的求和是从从1到100,所以需要一个循环,从1遍历到100。针对第一种情况,则遍历100次停下来。针对第二种情况,则遍历50次的时候停下来,针对第三种情况,则遍历10遍就停下来。
最后,在遍历每一个数字的时候,针对三种不同的情况求和。最后将三种不同请求的和加起来就是总体的和


#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次就不再执行情况2if (k <= 50){sum2 += k * k;} //遍历10次就不再执行情况3if (k <= 10){sum3 += 1.0 / k;}} 
total_sum = sum1 + sum2 + sum3;
printf("三种情况求和结果为:%lf\n", total_sum);
return 0;
}

其实本题可以使用暴力法来解,直接用三个for循环,只不过从算法的角度来看,那显然不如上面给的程序


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

从题目当中得到”水仙花数“为一个3位数,则范围确定为[100, 999]。另外需要获取该数字的百位数字,十位数字,个位数字相加起来等于该数本身,则我们需要使用到 % 除的方式,来获取每一个位权的数字。

  1. 当前题意当中描述的水仙花数是一个三位数,1~1000
  2. 采用%10的方式,求得三位数当中的每一位数字
    #include<stdio.h>
    int main()
    {//a表示百位数字,b表示十位数字,c表示个位数字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;
    }
    


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次反弹多高。

该题目需要循环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天共摘多少个桃子。

后一天的桃子数量 = 前一天桃子数量 / 2 - 1
前一天的桃子数量 = (后一天桃子数量+1) * 2
我们知道了第10天剩余桃子的数量,则可以依次推算出桃子的前一天桃子的总数。需要注意的点,猴子只是吃了9天,所以,我们只需要遍历9次就可以了


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)的根:

将区间划分为两部分,记录区间左右端点,得到中点。每次运算将中点带入方程进行运算,求得结果,
进行分析:
结果 > 0:将中位数赋值给右端点
结果 < 0:将中位数赋值给左端点
以此类推...
fabs函数是一个求绝对值的函数,求出x的绝对值,和数学上的概念相同;

1e-5:10^{-5},即0.00001


 


14. 输出以下图案:

   *
  ***
 *****
*******
 *****
  ***
   *

该题目需要关心当前行对应的从最左边到第一颗 * 的空格数量以及星星数量。将该题分为两个部分,前面4行和后面3行来进行拆分。
前4行中:
第一行:行号为0, 空格数为3,星星数量为1;
第二行:行号为1, 空格数为2, 星星数量为3;
第三行:行号为2, 空格数为1, 星星数量为5;
第四行:行号为3, 空格数为0,星星数量为7;

则我们可以推出两组关系,即行号和空格数量关系为:空格数 = 3 - 行号 。行号与星星的关系为星星数 = 2 * 行号 + 1
后三行中:
第一行:行号为0,空格数为1,星星数量为5;
第二行:行号为1, 空格数为2, 星星数量为3;
第三行:行号为2, 空格数为3,星星数量为1;
则我们推出两组关系,即行号与数量的关系:空格数 = 行号 + 1。行号与星星的关系:星星数 = 7- 2 *(行号+1)


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

从题面上得知,每队为3人,则隐含条件为队内三人是不能比赛的,并且A一定不会和X比,C一定不会X和Z比;则我们不难写出判断条件:
如果A和X比 或者 C和X比 或者 C和Z比 或者 A和B比 或者 A和C比 或者 B和C比,都是不可以的;所以我们只要穷举A比赛对象,B比赛对象,C比赛对象,判断上述条件就可以了;


后记:

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

                                                               ——By 作者:德塔


http://chatgpt.dhexx.cn/article/IMprtnen.shtml

相关文章

50道基础编程题

1、输入3个数&#xff0c;求最大值 int main() { int a,b,c,m; cin>>a>>b>>c; ma; if(b>m) mb; if(c>m) mc; cout<<m; } 2、编程序&#xff0c;求方程ax2bxc0的根 #include <iostream> #include<algorithm> #include<cmath&g…

DSSD(Deconvolutional Single Shot Detector)

本文作者将当前表现最好的分类器Residual-101和SSD进行了结合&#xff0c;并为SSDResidual-101添加了额外的降卷积层以引入大尺度的context用于提高目标检测的精度&#xff0c;尤其是小目标。DSSD又叫做deconvolutional single shot detector。虽然这两种贡献容易在高层上表达&…

DSSD学习笔记

本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义&#xff0c;以期加深自己的印象&#xff0c;后续可以随时翻看并且学习其中好的tricks。这一期介绍基于SSD改进的DSSD。 论文相关信息 论文全名为《DSSD : Deconvolutional Single Shot Detector》&a…

SSD系列(SSD、DSSD、FSSD 、RefineDet)

SSD:SingleShotMultiBoxDetector 简介 one-stage、基于回归的目标检测&#xff0c;74.3mAP、59FPS &#xff08; on VOC2007 test &#xff09;网络结构 SSD 300中输入图像的大小是300x300&#xff0c;特征提取部分使用了VGG16的卷积层&#xff0c;并将VGG16的两个全连接层转换…

DL之DSSD:DSSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

DL之DSSD&#xff1a;DSSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略 相关文章DL之DSSD&#xff1a;DSSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略DL之DSSD&#xff1a;DSSD算法的架构详解 DSSD算法的简介(论文介绍) DSSD&#xff0…

SDD和SDT

语法制导语法分析语义翻译&#xff1a; 语义翻译语义分析中间代码生成&#xff1b; 一&#xff1a;SDD: 依赖&#xff1a;A->B&#xff0c;表明B依赖A,A决定B。lexeme是虚属性。

SSD目标检测算法改进DSSD(反卷积)

论文&#xff1a;DSSD : Deconvolutional Single Shot Detector 论文地址&#xff1a;https://arxiv.org/abs/1701.06659 代码&#xff1a;https://github.com/chengyangfu/caffe/tree/dssd DSSD是2017年的CVPR&#xff0c;二作就是SSD的一作Wei Liu。另外值得一提的是&#xf…

SSD、DSSD算法详解

SSD(Single Shot MultiBox Detector) 特点:多尺度特征图用于检测;采用了先验框,,SDD backbone采用VGG-16 SSD和YOLO一样都是采用一个CNN网络进行检测,但是采用了多尺度的特征图,如下图所示: 采用多尺度特征图用于检测 采用步长stride=2的卷积或者pool来降低特征图…

sds

双向链表(adlist.h/adlist.c) 链表(list)是Redis中最基本的数据结构,由adlist.h和adlist.c定义。 数据结构 typedef struct listNode {//指向前一个节点struct listNode *prev;//指向后一个节点struct listNode *next;//值void *value; } listNode;listNode是最基本的结构,表示…

xSSD: DSSD,FSSD,ESSD,MDSSD,fireSSD

1 DSSD title :DSSD : Deconvolutional Single Shot Detector conf & anthor: arXiv, Cheng-Yang Fu arXiv:https://arxiv.org/abs/1701.06659 intro:Deconvolutional 主要内容&#xff1a; DSSD使用ResNet-101代替VGG作为主干网络&#xff0c;在‘SSD layers‘后面添加了…

redis SDS介绍

Redis面试中经常被问到&#xff0c;Redis效率为什么这么快&#xff0c;很多同学往往回答&#xff1a; ① Redis基于内存操作② Redis是单线程的&#xff0c;采用了IO多路复用技术③ Redis未使用C语言字符串&#xff0c;使用了SDS字符串然而&#xff0c;很少有人能说清楚SDS字符…

DSSD: Deconvolutional Single Shot Detector 论文笔记

论文地址&#xff1a;DSSD : Deconvolutional Single Shot Detector 项目地址&#xff1a;Github 概述 这篇论文应该算是SSD: Single Shot MultiBox Detector的第一个改进分支&#xff0c;作者是Cheng-Yang Fu&#xff0c; 我们熟知的Wei Liu大神在这里面是第二作者&#xf…

DSSD(Deconvolutional Single Shot Detector)算法理解

论文地址&#xff1a;https://arxiv.org/abs/1701.06659 Github 源码&#xff08;caffe版&#xff09;&#xff1a;https://github.com/chengyangfu/caffe/tree/dssd 1、文章概述 DSSD(Deconvolutional Single Shot Detector)是SSD算法改进分支中最为著名的一个&#xff0c;SS…

DSSD : Deconvolutional Single Shot Detector

参考 DSSD : Deconvolutional Single Shot Detector - 云社区 - 腾讯云 目录 一、简介 二、相关工作 三、反卷积的单阶段检测器DSSD 3.1、SSD 3.2、用VGG代替Residual-101 预测模型 反卷积SSD 反卷积模块 训练 四、实验 基本网络 PASCAL VOC 2007 在VOC2007上的消…

DDS 介绍

​DDS&#xff0c;全称 Data Distribution Service (数据分发服务)&#xff0c;由对象管理组(OMG)发布和维护&#xff0c;是一个中间件协议和API标准&#xff0c;采用发布/订阅体系架构&#xff0c;强调以数据为中心&#xff0c;提供丰富的QoS服务质量策略&#xff0c;以保障数…

目标检测系列:SSD系列SSD、FSSD、DSSD、DSOD

SSDDSSDFSSDDSOD SSD 动机 目前目标检测的一些算法包括基于深度学习的&#xff0c;都是先假定一些候选框&#xff0c;接着对候选框内容进行特征提取再分类&#xff0c;然后再对边框的位置进行修正这一系列的计算&#xff0c;最典型的例如Faster RCNN&#xff0c;虽然准确&…

计算机保密dss是啥,什么是DSS?

什么是DSS 上线时间&#xff1a;2020年9月4日 以下引用猪弟写的设计文档&#xff1a; DFS的存款系统: DSS (DFS Saving System) 原名DSR&#xff0c;你也可以把它称作&#xff0c;DFS的银行或DFS的余额宝。 它是专门为DFS量身定做的DFS币本位无风险保障性收入系统。 特征&#…

DDS介绍

DDS&#xff08;Data Distribution Service&#xff09; 数据分发服务 什么是DDS 数据分发服务&#xff08;DDS™&#xff09;是一个由对象管理组&#xff08;OMG&#xff09;发布的以数据为中心的中间件协议和API标准。采用分布式发布/订阅体系架构&#xff0c;以中间件的形…

SS, DSDS, DR-DSDS,DSDA 区别与理解

1.首先简单解释一下SS, DSDS, DSDA都是什么意思 SS(single standby)&#xff1a;单卡单待 DSDS(Dual SIM Dual Standby) &#xff1a;双卡双待 DSDA(Dual SIM dual active)&#xff1a;双卡双通 2.双卡双待/双卡双通主要区别 双待 &#xff1a; 两个卡都处于待机状态&#…

DSSD

目录 1. 概述2. DSSD2.1 overview2.2 Prediction module2.2 Deconvolution Module 论文&#xff1a;DSSD : Deconvolutional Single Shot Detector 来源&#xff1a;CVPR 2017 1. 概述 DSSD是对SSD的改进&#xff0c;虽然SSD直接在多尺度特征上进行预测的做法提升了目标检测的…