C语言:刷题日志(1)

2024-09-07 21:52
文章标签 语言 日志 刷题

本文主要是介绍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;
}

这篇关于C语言:刷题日志(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146259

相关文章

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

SQL Server清除日志文件ERRORLOG和删除tempdb.mdf

《SQLServer清除日志文件ERRORLOG和删除tempdb.mdf》数据库再使用一段时间后,日志文件会增大,特别是在磁盘容量不足的情况下,更是需要缩减,以下为缩减方法:如果可以停止SQLSe... 目录缩减 ERRORLOG 文件(停止服务后)停止 SQL Server 服务:找到错误日志文件:删除

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st