实际题目

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

函数接口定义:

void Print_Factorial ( const int N );

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

裁判测试程序样例:

#include <stdio.h>void Print_Factorial ( const int N );int main()
{int N;scanf("%d", &N);Print_Factorial(N);return 0;
}/* 你的代码将被嵌在这里 */

输入样例:

15

输出样例:

1307674368000

通过代码

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

知识点分析

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

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

转载于:https://www.cnblogs.com/hx97/p/10789237.html

#035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)相关推荐

  1. 阶乘计算升级版 (20分)_求1!+2!+3!+...+20!的和

    题目:求1!+2!+3!+...+20!的和 阶乘定义: n! = 1 * 2 * 3 * - * n 难度 简单 参考答案 核心是阶乘的计算. 20!的阶乘的位数的估算非常重要,导致在定义阶乘函数的 ...

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

    问题描述: 解题思路: 由于N最大为1000,int的范围最大为10的9次方,long long int的范围最大为10的18次方,使用斯特林公式计算可知,n为12时,结果的位数已经为9,故N取100 ...

  3. C++学习之路 | PTA乙级—— 1063 计算谱半径 (20 分)(精简)

    1063 计算谱半径 (20 分) 在数学中,矩阵的"谱半径"是指其特征值的模集合的上确界.换言之,对于给定的 n 个复数空间的特征值 { a ​1 ​​ +b ​1 ​​ i,⋯ ...

  4. 时间格式的转换 例如:(2021-05-10 14:20:43) 转为( 2021年5月10日 14时20分43秒)

    console.log(name('2021-02-10 14:20:43'));function name(date) {const arr = date.split(/[-: ]/)return ...

  5. PTA:6-2顺序表操作集(20分)

    大一下半期数据结构 数据结构题目集 PTA:顺序表操作集(20分) 本题要求实现顺序表的操作集. 函数接口定义 List MakeEmpty(); Position Find( List L, Ele ...

  6. C++学习之路 | PTA乙级—— 1087 有多少不同的值 (20 分)(精简)

    1087 有多少不同的值 (20 分) 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然 ...

  7. C++学习之路 | PTA乙级—— 1049 数列的片段和 (20 分)(精简)

    1049 数列的片段和 (20 分) 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0. ...

  8. C++学习之路 | PTA乙级—— 1038 统计同成绩学生 (20 分)(精简)

    1038 统计同成绩学生 (20 分) 本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 10 ​5 ​​ 的正整数 N,即学生总人数.随后一 ...

  9. C++学习之路 | PTA乙级—— 1037 在霍格沃茨找零钱 (20 分)(精简)

    1037 在霍格沃茨找零钱 (20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十 ...

最新文章

  1. 用[bx+idata]的方式进行数组的处理
  2. 合并数组:双针模型,原地实现
  3. linux中shell自动对齐代码,linux – Shell编程 – 如何printf像表一样对齐我的输出?...
  4. 多线程的那点儿事(之避免死锁)
  5. 设置代理_PC客户端爬虫,这样设置代理就对了
  6. 钉钉现身数博会:增长200% 年内要覆盖450万家企业组织
  7. 2021 小白版,360 行行行转 IT
  8. 如何开启计算机cpu虚拟化,win10如何开启虚拟化支持_win10开启cpu虚拟化的方法
  9. 河北工程大学计算机类专业排名,河北工程大学优势专业排名,2021年河北工程大学最好的专业排名...
  10. 计算机组装过程分为哪几步,组装新电脑要经过哪些步骤?
  11. 小学计算机应用到英语课教案,信息技术与小学英语教学有效融合(转载)
  12. 荣耀v40和华为nova8参数对比哪个好 华为nova8和荣耀v40的区别
  13. 大写金额换算器iOS版源代码
  14. 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)
  15. 从零开始写JavaScript框架(一)
  16. Markdown 图片左右对齐、居中、大小设置
  17. [2002] PDOException in Connection.php line 295
  18. python for多线程_python for 怎么多线程
  19. Linux后台开发工具箱-葵花宝典
  20. ps复制文字到html,在photoshop中复制粘贴文字的方法教程

热门文章

  1. Struts2标签 逻辑标签和UI标签
  2. python文件指针_在使用python写入文件之前,如何将文件指针放在上面一行?
  3. 剑指Offer #12 数值的整数次方(快速幂)
  4. 你知道Integer和int的区别吗
  5. 四位共阳极数码管显示函数_Verilog笔记
  6. 电脑关机慢是什么原因_为什么电脑无法关机?电脑无法正常关机的解决方案
  7. 超适合新手的Oracle查询语句
  8. 【收藏】网络故障处理手册大全,看完再也不怕出问题了
  9. 轻松搭建基于 Serverless 的 ThinkPHP 应用
  10. 函数平移口诀_八年级数学下册:一次函数的图像,平移口诀是“上加下减,左加右减”...