实际题目

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

函数接口定义:

  1. void Print_Factorial ( const int N );

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

裁判测试程序样例:

  1. #include <stdio.h>
  2. void Print_Factorial ( const int N );
  3. int main()
  4. {
  5. int N;
  6. scanf("%d", &N);
  7. Print_Factorial(N);
  8. return 0;
  9. }
  10. /* 你的代码将被嵌在这里 */

输入样例:

  1. 15

输出样例:

  1. 1307674368000

通过代码

  1. void Print_Factorial ( const int N ){
  2. int a[];
  3. int n=N;
  4. if(n<||n>){
  5. printf("Invalid input");
  6. return ;
  7. }
  8. if(n==){
  9. printf("");
  10. return ;
  11. }
  12. else{
  13. int w=;
  14. int i=, j=;
  15. int t=n;
  16. int k=; // 表示数据的位数。
  17.  
  18. i=, k=;
  19. while(t) //把数字按位数传入数组
  20. {
  21. a[i++] = t%;
  22. t/=;
  23. k++;
  24. }
  25.  
  26. for (j=n-; j>; j--) //开始阶乘
  27. {
  28. w=; // 表示进位
  29. for (i=; i<k; i++)
  30. {
  31. t = a[i]*j+w; //每个位数乘乘数因子+是否进位
  32. a[i] = t%;
  33. w = t/;
  34. }
  35.  
  36. while(w) //需要进位了
  37. {
  38. a[i++] = w%;
  39. w/=;
  40. k++;
  41. }
  42. }
  43. int ttt=;
  44. int ii=;
  45.  
  46. for (ii=k-; ii>=; ii--)
  47. {
  48. printf("%d",a[ii]);
  49. }
  50.  
  51. }
  52. return ;
  53.  
  54. }

知识点分析

求阶乘,数过大,使用了数组进行存储

例子中1000阶乘大约2500位,所以使用数组a[3000]

建立一个计算的函数

int fanc(int n)
{
int w=0;
int i=0, j=0;
int t=n;
int k=0; // 表示数据的位数。

i=0, k=0;
while(t) //把数字按位数传入数组
{
a[i++] = t%10;
t/=10;
k++;
}

for (j=n-1; j>1; j--) //开始阶乘
{
w=0; // 表示进位
for (i=0; i<k; i++)
{
t = a[i]*j+w; //每个位数乘乘数因子+是否进位
a[i] = t%10;
w = t/10;
}

while(w) //需要进位了
{
a[i++] = w%10;
w/=10;
k++;
}
}
return k;
}

建立一个打印的函数

个位存在数组第一个位置,十位存在第二个,以此类推,

所以输出的时候要反向输出。

123是按照 3 2 1存储的

void show(int k)
{
int i=0;
printf("位数 %d 位\n",k);
for (i=k-1; i>=0; i--)
{
printf("%d",a[i]);
}
}

引用博客

链接:

大数运算_求1000的阶乘(C语言实现)

引用代码

  1. // 1000 的阶乘 2568 位
  2. #include <stdio.h>
  3.  
  4. int a[];
  5.  
  6. void show(int k)
  7. {
  8. int i=;
  9. printf("位数 %d 位\n",k);
  10. for (i=k-; i>=; i--)
  11. {
  12. printf("%d",a[i]);
  13. }
  14. }
  15.  
  16. int fanc(int n)
  17. {
  18. int w=;
  19. int i=, j=;
  20. int t=n;
  21. int k=; // 表示数据的位数。
  22.  
  23. i=, k=;
  24. while(t)
  25. {
  26. a[i++] = t%;
  27. t/=;
  28. k++;
  29. }
  30.  
  31. for (j=n-; j>; j--)
  32. {
  33. w=; // 表示进位
  34. for (i=; i<k; i++)
  35. {
  36. t = a[i]*j+w;
  37. a[i] = t%;
  38. w = t/;
  39. }
  40.  
  41. while(w)
  42. {
  43. a[i++] = w%;
  44. w/=;
  45. k++;
  46. }
  47. }
  48. return k;
  49. }
  50.  
  51. int main()
  52. {
  53. int n;
  54. int k=;
  55.  
  56. scanf("%d",&n);
  57. k = fanc(n);
  58. show(k);
  59. printf("\n");
  60. return ;
  61. }

#035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)的更多相关文章

  1. PAT 基础编程题目集 6-10 阶乘计算升级版 (20 分)

    本题要求实现一个打印非负整数阶乘的函数. 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000.如果N是非负整数,则该 ...

  2. PTA 7-1 邻接矩阵表示法创建无向图 (20分)

    PTA 7-1 邻接矩阵表示法创建无向图 (20分) 采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶 ...

  3. PTA数据结构 习题2.8 输出全排列 (20分)

    习题2.8 输出全排列 (20分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出正整数n(<10 ...

  4. PTA数据结构 习题2.1 简单计算器 (20分)

    习题2.1 简单计算器 (20分) 模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算 ...

  5. PTA | 1008 数组元素循环右移问题 (20分)

    一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 ...

  6. 【九度OJ】题目1179:阶乘 解题报告

    [九度OJ]题目1179:阶乘 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1179 题目描述: 输入n, 求y1=1!+3!+-m ...

  7. PTA题目集7-9总结

    PTA题目集7-9总结 一.前言 题目集七:该题集为轮到图形卡片排序游戏题,主要考查的知识点有类的继承,ArrayList泛型的使用,Compabale接口的运用,多态的使用方法以及接口的应用,难度较 ...

  8. PTA题目集总结

    PTA题目集1-3总结 一:前言 我认为题目集一的有八个题目,题量可能稍微有点多,但是题型较为简单,基本为入门题:题集二有五道题,题量适度,难度也适中:题集三虽然只有三道题,但是难度却骤然提升,前两题 ...

  9. for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和

    //4的阶乘 int jc = 4; //定义一个变量用来代表要计算的数值 long jd =1; //定义最终输出的阶乘 for(int i = 1; i <= jc;i++) //定义循环加 ...

随机推荐

  1. MySQL数据库优化方案

    优化索引.SQL语句.分析慢查询: 设计数据表的时候,严格根据数据库的设计范式来设计数据库表: 使用缓存,把经常访问的又不经常更改的数据放到缓存中,能减少磁盘I/O: 优化硬盘,使用SSD,使用磁盘队 ...

  2. Ocelot 资源汇总

    前言 最近一两年.NET Core的关注度持续上升, 微服务及云原生应用开发上采用.NET Core也越来越多,Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认 ...

  3. 升讯威微信营销系统开发实践:(3)功能介绍与此项目推广过程的一些体会( 完整开源于 Github)

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  4. Java 10 var关键字详解和示例教程

    在本文中,我将通过示例介绍新的Java SE 10特性——“var”类型.你将学习如何在代码中正确使用它,以及在什么情况下不能使用它. 介绍 Java 10引入了一个闪亮的新功能:局部变量类型推断.对 ...

  5. RecyclerView实现一个页面有多种item,每个item有多个view,并且可以让任意item的任意view自定义监听,通过接口方法进行触发操作

    百度了很多贴子,看着大佬的博客,模仿尝试,最终都是以失败告终,api可能版本不一样, 毕竟博客大佬都是7~8前写的,日期新点的都是好几年前了,多次尝试,还是报出莫名其妙的错. 哎,忧伤. 翻阅各种资料 ...

  6. [翻译]各个类型的IO - 阻塞, 非阻塞,多路复用和异步

    同事推荐,感觉写的不错就试着翻译了下. 原文链接: https://www.rubberducking.com/2018/05/the-various-kinds-of-io-blocking-non ...

  7. springboot打包不同环境配置与shell脚本部署

    本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...

  8. Java注解(Annotation):请不要小看我!

    Java注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分.注解对于代码的运行效果没有直接影响. 网络上对注解的解释过于严肃.刻板,这并不是我喜欢的风格.尽管这样的 ...

  9. C++ 编程技巧笔记记录(持续更新)

    C++是博大精深的语言,特性复杂得跟北京二环一样,继承乱得跟乱伦似的. 不过它仍然是我最熟悉且必须用在游戏开发上的语言,这篇文章用于挑选出一些个人觉得重要的条款/经验/技巧进行记录总结. 文章最后列出 ...

  10. JavaScript类型相关常用操作

    JS数组,字符串,json互相转换 JS数组转字符串 使用数组自带的join方法可以把数组转化为字符串: let arr = [1,2,'uu']; let str = arr.join(','); ...