当前位置: 首页 > news >正文

C语言:刷题日志(1)

一.阶乘计算升级版

本题要求实现一个打印非负整数阶乘的函数。

其中n是用户传入的参数,其值不超过1000。如果n是非负整数,则该函数必须在一行中打印出n!的值,否则打印“Invalid input”。

首先,知道阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。那么我们先来个简单的阶乘计算吧。


#include<stdio.h>
int Fact(int n)
{if (n <= 1)return 1;elsereturn n * Fact(n - 1);
}
int main()
{int n;scanf("%d", &n);int ret = Fact(n);printf("%d", ret);return 0;
}

 这样,我们就用这段代码来计算一下5的阶乘吧。

我们可以发现我们成功计算了5的阶乘,但我感觉数不够大,想要计算一下100的阶乘。

 我们发现得出的结果居然是0,这明显不是100的阶乘,这是为什么呢?其实原因很明显,就是溢出了,int类型的的数据最大能表示2的16次方减1,然而100的阶乘已经比这个数大了,所以我们就无法正确输出结果,现在题目要求不超过1000,但现在100就已经不行了,我们该怎么解决他呢?

让我们来看一下代码吧! 

#include <stdio.h>void Print_Factorial(const int N)
{char a[3000] = { 0 };//设置一个存放结果的数组int l = 1;//对赋值次数的限制a[0] = 1;//将首元素设置为1if (N < 0)//如果是负数{printf("Invalid input\n");return 0;}for (int i = 2; i <= N; i++)//从2开始进行阶乘{int z = 0;for (int k = 0; k < l; k++)//对数组进行赋值{int t = i * a[k] + z;a[k] = t % 10;z = t / 10;}while (z)//得到进位的数,同时改变下一次上个代码的循环次数{a[l++] = z % 10;z /= 10;}}for (int i = l - 1; i >= 0; i--)//打印结果{printf("%d", a[i]);}
}int main()
{int N;scanf("%d", &N);Print_Factorial(N);return 0;
}

讲解 

我们先举个例子123*12=1476 

 

我们看完这个例子之后我们其实可以用这种方法来推理出他的运算方式 


假设n = 5的阶乘 5! = 1 * 2 * 3 * 4 * 5
i = 2 时 k = 0 k < (l = 1) z = 0t = i * a[0] + z = 2 * 1 + 0 = 2     a[0] = t % 10 = 2 % 10 = 2    z = t / 10 = 2 / 10 = 0
i = 3 时 k = 0 k < (l = 1) z = 0t = i * a[0] + z = 3 * 2 + 0 = 6     a[0] = t % 10 = 6 % 10 = 6    z = t / 10 = 6 / 10 = 0
i = 4 时 k = 0 k < (l = 1) z = 0t = i * a[0] + z = 4 * 6 + 0 = 24    a[0] = t % 10 = 24 % 10 = 4   z = t / 10 = 24 / 10 = 2 由于z != 0进入while循环改变逐渐改变arr[0]arr[1].....的值a[l++] = a[1] = z % 10 = 2 % 10 = 2  z = z / 10 = 2 / 10 = 0
i = 5 时 k = 0 k < (l = 2) z = 0t = i * a[0] + z = 5 * 4 + 0 = 20    a[0] = t % 10 = 20 % 10 = 0   z = t / 10 = 20 / 10 = 2t = i * a[1] + z = 5 * 2 + 2 = 12    a[1] = t % 10 = 12 % 10 = 2   z = t / 10 = 12 / 10 = 1 由于z != 0进入while循环改变逐渐改变arr[0]arr[1].....的值a[l++] = a[2] = z % 10 = 1 % 10 = 1  z = z / 10 = 1 / 10 = 0到这时循环已经结束 由于l++在多次循环之后l=3,而我们所求的结果就是我们在循环期间所改变的arr的值

 看这回我们不只成功的打印了5的阶乘,也成功打印了100的阶乘

二. 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:

输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310

题目讲解: 

对于题目的描述,我们其实可以发现如果我们将给我们的起始时间去除上100,就是起始的小时模上100得到的就是起始的分钟,这时我们只要将起始分钟加上给我们的流逝分钟再加上小时数乘以60,所得到的就是总的分钟数,当然这时我们让总的分钟数除以60就能得到小时数,然而一天为24小时所以我们需要将小时控制在24小时之内,其实要得到它非常的简单,只需要我们将小时数模上24就可以了,当然求完小时后我们还要求剩余的分钟数,这就很简单了将总的分钟数模上60就能得到剩余的分钟数了,注意如果剩余的分钟数为单个数我们需要进行补零。

#include<stdio.h>
int main()
{int n,m,h,min,H;scanf("%d %d",&n,&m);h=n/100;min=n%100;H=h*60+min+m;printf("%d%02d",(H/60)%24,H%60);}

三.求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:

首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X

输入样例:

-3 8

输出样例: 

   -3   -2   -1    0    12    3    4    5    67    8
Sum = 30

题目讲解:

根据题目我们知道我们要先找到a到b之间的数,这我们只需要运用for循环即可,将i的初始值设为a,将循环条件设置为i<=b,并让每次循环i都加1,这样我们就成功找到了a到b之间的数,之后我们再看看的输出格式的限制他要求我们每打印5个数就要换行并且当最后一行不满5个数的时候也要进行换行。这样其实我们就可以设置一个计数器count,让每输入一个数count就加一,当count=5的时候将他进行换行处理,并且重新将count赋值为0,之后将所有的数加在一起放到sum里,但是输出还要求我们,如果最后不满5个数也要进行换行,所以在循环结束后,如果剩余的数不足5个,就说明count最后没有被重新赋值为0,我们只需要在循环外进行对count是否等于0的判断,如果不等于零就进行换行,最后在打印a到b之间数的和。

#include<stdio.h>
int main()
{int a,b;scanf("%d %d",&a,&b);int sum=0,count=0;int i,j;for(i=a;i<=b;i++){count++;printf("%5d",i);if(count%5==0){printf("\n");count=0;}sum+=i;}if(count!=0){printf("\n");}printf("Sum = %d",sum);return 0;
}

 四.爬动的蠕虫

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:

输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。

输出格式:

在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:

12 3 1

输出样例:

11

题目讲解 

题目其实很好理解,就是一条蠕虫向上爬,每分钟能爬u寸,每次爬完之后会进行一分钟的休息同时下滑d寸。这其实就很好理解了,我们只需要设置一个变量x,如果x小于井的长度就让他加上一分钟爬的u寸,同时时间变量t也要加一,但是题目告诉我们如果爬完之后的高度并没有出井,蠕虫就要休息一分钟,并且下滑d寸,所以我们要设置一个判断如果x爬完的高度依然小于n井高,就让x-d,时间同时也加1,当然如果没有达到井上,蠕虫还要进行爬行,所以我们要将这一次的爬行放入循环中,直到蠕虫爬出井,结束循环并打印所消耗的时间。

#include<stdio.h>
int main()
{int n,d,u;scanf("%d%d%d",&n,&u,&d);int x=0,t=0;while(x<n){x+=u;t++;if(x<n){x-=d;t++;}}printf("%d",t);return 0;
}

五.龟兔赛跑

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:

242

输出样例:

@_@ 726

题目讲解 :

时间

乌龟

兔子

0

0

0

190

570

630

10

30

90

200

600

630

20

60

90

210

630

630

30

90

90

220

660

630

40

120

90

230

690

720

50

150

180

240

720

720

60

180

180

250

750

720

70

210

180

260

780

720

80

240

180

270

810

810

90

270

270

100

300

360

110

330

360

120

360

360

130

390

360

140

420

450

150

450

450

160

480

450

170

510

450

180

540

540

我们通过这个表格可以发现90min为一个周期0min,90min,180min,270min,每到这些时间乌龟和兔子就会相遇,并且我们发现兔子在一个周期上总是在起始时间到十分钟,时间到40分钟到之后的10分钟,时间到80到之后的10分钟,即每个周期的0-10min,40-50min,80-90min,在这些期间内兔子才会运动,而乌龟时一直在运动,所以,我们给出时间可以直接计算出乌龟所运动的路程,

而,兔子所运动的路程我们只要找到总时间在这些时间分段里总共出现了多少分钟即可,每找到一次路程就加9,当然我们要利用while循环让时间不停的前进,并在循环中设置判断条件,既然时90min一周期,只要然时间去模上90,看时间是否在0-10min,40-50min,80-90min之内,每在一次路程就加9。

#include<stdio.h>
int main()
{int tu=0,gui=0,t=0,T;scanf("%d",&T);gui=T*3;while(t<T){if((t%90>=0&&t%90<10)||(t%90>=40&&t%90<50)||(t%90>=80&&t%90<90)){tu+=9;}t++;}if(gui>tu)printf("@_@ %d",gui);else if(tu>gui)printf("^_^ %d",tu);elseprintf("-_- %d",tu);return 0;
}

相关文章:

  • 汇编:嵌入式软件架构学习资源
  • 测试基础|记一次CPU冲高的排查过程!
  • WSL 下的 CentOS 装 Docker
  • Ubuntu 22.04 make menuconfig 失败原因
  • SAP学习笔记 - 开发03 - CDSView开发环境搭建,Eclipse中连接SAP,CDSView创建
  • 认知杂谈54
  • AAudio的延迟优化
  • SpringMVC基于注解使用:国际化
  • 点云数据常见的坐标系有哪些,如何进行转换?
  • 红旗EQM换电连接器哪家生产
  • Vue3 父子传参 简单易懂
  • 视频处理基础之gradio框架实现
  • Transformer从零详细解读
  • 5G前传-介绍
  • IBM Storwize V7000存储控制器故障节点报错574
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Angular 响应式表单之下拉框
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • classpath对获取配置文件的影响
  • C语言笔记(第一章:C语言编程)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PHP 7 修改了什么呢 -- 2
  • Python_OOP
  • React Native移动开发实战-3-实现页面间的数据传递
  • webpack入门学习手记(二)
  • 彻底搞懂浏览器Event-loop
  • 基于 Babel 的 npm 包最小化设置
  • 计算机在识别图像时“看到”了什么?
  • 事件委托的小应用
  • 怎样选择前端框架
  • 阿里云服务器购买完整流程
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​补​充​经​纬​恒​润​一​面​
  • # 飞书APP集成平台-数字化落地
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (PADS学习)第二章:原理图绘制 第一部分
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (六)软件测试分工
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)事件系统
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)C#调用WebService 基础
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .htaccess配置常用技巧
  • .net的socket示例
  • @RestController注解的使用
  • [ C++ ] STL_list 使用及其模拟实现
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042