贵阳做网站多少钱,设计签名免费名字,手机上编程软件,佛山效果好上首页推广一.阶乘计算升级版
本题要求实现一个打印非负整数阶乘的函数。
其中n是用户传入的参数#xff0c;其值不超过1000。如果n是非负整数#xff0c;则该函数必须在一行中打印出n!的值#xff0c;否则打印“Invalid input”。
首先#xff0c;知道阶乘是所有小于及等于该数的…一.阶乘计算升级版
本题要求实现一个打印非负整数阶乘的函数。
其中n是用户传入的参数其值不超过1000。如果n是非负整数则该函数必须在一行中打印出n!的值否则打印“Invalid input”。
首先知道阶乘是所有小于及等于该数的正整数的积并且0的阶乘为1。那么我们先来个简单的阶乘计算吧。 #includestdio.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.hvoid 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*121476 我们看完这个例子之后我们其实可以用这种方法来推理出他的运算方式 假设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在多次循环之后l3,而我们所求的结果就是我们在循环期间所改变的arr的值 看这回我们不只成功的打印了5的阶乘也成功打印了100的阶乘 二. 然后是几点
有时候人们用四位数字表示一个时间比如 1106 表示 11 点零 6 分。现在你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字第一个数字以这样的四位数字表示当前时间第二个数字表示分钟数计算当前时间经过那么多分钟后是几点结果也表示为四位数字。当小时为个位数时没有前导的零例如 5 点 30 分表示为 5300 点 30 分表示为 030。注意第二个数字表示的分钟数可能超过 60也可能是负数。
输入格式
输入在一行中给出 2 个整数分别是四位数字表示的起始时间、以及流逝的分钟数其间以空格分隔。注意在起始时间中当小时为个位数时没有前导的零即 5 点 30 分表示为 5300 点 30 分表示为 030。流逝的分钟数可能超过 60也可能是负数。
输出格式
输出不多于四位数字表示的终止时间当小时为个位数时没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例
1120 110输出样例
1310
题目讲解 对于题目的描述我们其实可以发现如果我们将给我们的起始时间去除上100就是起始的小时模上100得到的就是起始的分钟这时我们只要将起始分钟加上给我们的流逝分钟再加上小时数乘以60所得到的就是总的分钟数当然这时我们让总的分钟数除以60就能得到小时数然而一天为24小时所以我们需要将小时控制在24小时之内其实要得到它非常的简单只需要我们将小时数模上24就可以了当然求完小时后我们还要求剩余的分钟数这就很简单了将总的分钟数模上60就能得到剩余的分钟数了,注意如果剩余的分钟数为单个数我们需要进行补零。 #includestdio.h
int main()
{int n,m,h,min,H;scanf(%d %d,n,m);hn/100;minn%100;Hh*60minm;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将循环条件设置为ib,并让每次循环i都加1这样我们就成功找到了a到b之间的数之后我们再看看的输出格式的限制他要求我们每打印5个数就要换行并且当最后一行不满5个数的时候也要进行换行。这样其实我们就可以设置一个计数器count让每输入一个数count就加一当count5的时候将他进行换行处理并且重新将count赋值为0之后将所有的数加在一起放到sum里但是输出还要求我们如果最后不满5个数也要进行换行所以在循环结束后如果剩余的数不足5个就说明count最后没有被重新赋值为0我们只需要在循环外进行对count是否等于0的判断如果不等于零就进行换行最后在打印a到b之间数的和。 #includestdio.h
int main()
{int a,b;scanf(%d %d,a,b);int sum0,count0;int i,j;for(ia;ib;i){count;printf(%5d,i);if(count%50){printf(\n);count0;}sumi;}if(count!0){printf(\n);}printf(Sum %d,sum);return 0;
} 四.爬动的蠕虫
一条蠕虫长1寸在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸但必须休息1分钟才能接着往上爬。在休息的过程中蠕虫又下滑了D寸。就这样上爬和下滑重复进行。请问蠕虫需要多长时间才能爬出井
这里要求不足1分钟按1分钟计并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部那么蠕虫就完成任务了。初始时蠕虫是趴在井底的即高度为0。
输入格式
输入在一行中顺序给出3个正整数N、U、D其中DUN不超过100。
输出格式
在一行中输出蠕虫爬出井的时间以分钟为单位。
输入样例
12 3 1输出样例
11
题目讲解 题目其实很好理解就是一条蠕虫向上爬每分钟能爬u寸每次爬完之后会进行一分钟的休息同时下滑d寸。这其实就很好理解了我们只需要设置一个变量x如果x小于井的长度就让他加上一分钟爬的u寸同时时间变量t也要加一但是题目告诉我们如果爬完之后的高度并没有出井蠕虫就要休息一分钟并且下滑d寸所以我们要设置一个判断如果x爬完的高度依然小于n井高就让x-d时间同时也加1当然如果没有达到井上蠕虫还要进行爬行所以我们要将这一次的爬行放入循环中直到蠕虫爬出井结束循环并打印所消耗的时间。 #includestdio.h
int main()
{int n,d,u;scanf(%d%d%d,n,u,d);int x0,t0;while(xn){xu;t;if(xn){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为一个周期0min90min180min270min,每到这些时间乌龟和兔子就会相遇并且我们发现兔子在一个周期上总是在起始时间到十分钟时间到40分钟到之后的10分钟时间到80到之后的10分钟即每个周期的0-10min,40-50min,80-90min在这些期间内兔子才会运动而乌龟时一直在运动所以我们给出时间可以直接计算出乌龟所运动的路程 而兔子所运动的路程我们只要找到总时间在这些时间分段里总共出现了多少分钟即可每找到一次路程就加9当然我们要利用while循环让时间不停的前进并在循环中设置判断条件既然时90min一周期只要然时间去模上90看时间是否在0-10min,40-50min,80-90min之内每在一次路程就加9。 #includestdio.h
int main()
{int tu0,gui0,t0,T;scanf(%d,T);guiT*3;while(tT){if((t%900t%9010)||(t%9040t%9050)||(t%9080t%9090)){tu9;}t;}if(guitu)printf(_ %d,gui);else if(tugui)printf(^_^ %d,tu);elseprintf(-_- %d,tu);return 0;
}