#035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)
实际题目
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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 分)相关推荐
- 阶乘计算升级版 (20分)_求1!+2!+3!+...+20!的和
题目:求1!+2!+3!+...+20!的和 阶乘定义: n! = 1 * 2 * 3 * - * n 难度 简单 参考答案 核心是阶乘的计算. 20!的阶乘的位数的估算非常重要,导致在定义阶乘函数的 ...
- 基础编程题目集 6-10 阶乘计算升级版 (20 分)
问题描述: 解题思路: 由于N最大为1000,int的范围最大为10的9次方,long long int的范围最大为10的18次方,使用斯特林公式计算可知,n为12时,结果的位数已经为9,故N取100 ...
- C++学习之路 | PTA乙级—— 1063 计算谱半径 (20 分)(精简)
1063 计算谱半径 (20 分) 在数学中,矩阵的"谱半径"是指其特征值的模集合的上确界.换言之,对于给定的 n 个复数空间的特征值 { a 1 +b 1 i,⋯ ...
- 时间格式的转换 例如:(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 ...
- PTA:6-2顺序表操作集(20分)
大一下半期数据结构 数据结构题目集 PTA:顺序表操作集(20分) 本题要求实现顺序表的操作集. 函数接口定义 List MakeEmpty(); Position Find( List L, Ele ...
- C++学习之路 | PTA乙级—— 1087 有多少不同的值 (20 分)(精简)
1087 有多少不同的值 (20 分) 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然 ...
- C++学习之路 | PTA乙级—— 1049 数列的片段和 (20 分)(精简)
1049 数列的片段和 (20 分) 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0. ...
- C++学习之路 | PTA乙级—— 1038 统计同成绩学生 (20 分)(精简)
1038 统计同成绩学生 (20 分) 本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 10 5 的正整数 N,即学生总人数.随后一 ...
- C++学习之路 | PTA乙级—— 1037 在霍格沃茨找零钱 (20 分)(精简)
1037 在霍格沃茨找零钱 (20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十 ...
最新文章
- 用[bx+idata]的方式进行数组的处理
- 合并数组:双针模型,原地实现
- linux中shell自动对齐代码,linux – Shell编程 – 如何printf像表一样对齐我的输出?...
- 多线程的那点儿事(之避免死锁)
- 设置代理_PC客户端爬虫,这样设置代理就对了
- 钉钉现身数博会:增长200% 年内要覆盖450万家企业组织
- 2021 小白版,360 行行行转 IT
- 如何开启计算机cpu虚拟化,win10如何开启虚拟化支持_win10开启cpu虚拟化的方法
- 河北工程大学计算机类专业排名,河北工程大学优势专业排名,2021年河北工程大学最好的专业排名...
- 计算机组装过程分为哪几步,组装新电脑要经过哪些步骤?
- 小学计算机应用到英语课教案,信息技术与小学英语教学有效融合(转载)
- 荣耀v40和华为nova8参数对比哪个好 华为nova8和荣耀v40的区别
- 大写金额换算器iOS版源代码
- 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)
- 从零开始写JavaScript框架(一)
- Markdown 图片左右对齐、居中、大小设置
- [2002] PDOException in Connection.php line 295
- python for多线程_python for 怎么多线程
- Linux后台开发工具箱-葵花宝典
- ps复制文字到html,在photoshop中复制粘贴文字的方法教程
热门文章
- Struts2标签 逻辑标签和UI标签
- python文件指针_在使用python写入文件之前,如何将文件指针放在上面一行?
- 剑指Offer #12 数值的整数次方(快速幂)
- 你知道Integer和int的区别吗
- 四位共阳极数码管显示函数_Verilog笔记
- 电脑关机慢是什么原因_为什么电脑无法关机?电脑无法正常关机的解决方案
- 超适合新手的Oracle查询语句
- 【收藏】网络故障处理手册大全,看完再也不怕出问题了
- 轻松搭建基于 Serverless 的 ThinkPHP 应用
- 函数平移口诀_八年级数学下册:一次函数的图像,平移口诀是“上加下减,左加右减”...