阶乘运算——ACM
大数阶乘
- 描述
- 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
- 输入
- 输入一个整数m(0<m<=5000)
- 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符
- 样例输入
-
50
- 样例输出
-
30414093201713378043612608166064768844377641568960512000000000000 看到大数运算首先想到的是运用数组在表示大数,以前是用过int型数组,但是考虑到这将会占用大量内存。所以决定尝试 char型数组,char和int的转化很简单,(int)(n - 48)和(char)(c + 48)。
然后就是解决大数的乘法问题,乘法中的难点在进位。想起来很简单,可实际上程序实现起来非常复杂,差不多用了我一下午时间,真是惭愧。下面就是程序:#include <stdio.h>
#include <string.h>
#include <stdlib.h> #define NUM 20000 int main(char argc, char**argv)
{
char a[NUM];
char t[NUM];
char nstr[];
int i, n, oldj = ,len = ;
scanf("%d", &n); memset(a,,NUM*sizeof(char));
a[] = '';
memset(t,,NUM*sizeof(char));
t[] = ''; for(i = ; i <= n; i++)
{
int count = , lastAdd = , j, c = ;
int ii = i;
// 拷贝字符串数组
strcpy(a, t);
// 整数n的转化
while(ii)
{
ii/=;
count++;
}
sprintf(nstr, "%d", i); for(c = ; c < count - ; c++)
{
if(a[oldj + c] == '\0')
a[oldj + c] = '';
} for(j = ; j < NUM; j++)
{
int remain;
int nn = , k; if(a[j] == '\0')
break; for(k = ; k <= j && k < count; k++)
{
nn += (int)(nstr[count--k] - ) * (int)(a[j - k] - );
}
nn += lastAdd;
lastAdd = nn / ;
remain = nn % ;
if(lastAdd != && a[j + ] == '\0')
a[j + ] = '';
t[j] = (char)(remain + );
}
oldj = j;
} for(i = oldj-; i >= ; i--)
{
printf("%c", t[i]);
}
printf("\n"); system("pause");
}提交代码后发现还有更优的算法,而且在时间和空间上比我的程序好好几倍。瞬间感觉自己弱爆了。
#include<stdio.h>
#include<string.h>
const int maxn=;
int a[maxn];
int main()
{
int n,i,j,s,c;
scanf("%d",&n);
memset(a,,sizeof(a));
a[]=;
for(i=;i<=n;i++)
{c=;
for(j=;j<=maxn;j++)
{
s=a[j]*i+c;
a[j]=s%;
c=s/;
}
}
for(j=maxn;j>=;j--) if(a[j]) break;
for(i=j;i>=;i--) printf("%d",a[i]);
printf("\n");
return ;
}基本思路基本一致,只不过它用的是int型数组,但是为什么我的程序运行速度更慢,也许是字符和数字之间的转化太多造成的。弄巧成拙了。。
阶乘运算——ACM的更多相关文章
- C 数组模拟阶乘运算
#include <stdio.h> void rdump(int arr[],int len) { ; ;i >= ; --i) { printf("%d",a ...
- for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和
//4的阶乘 int jc = 4; //定义一个变量用来代表要计算的数值 long jd =1; //定义最终输出的阶乘 for(int i = 1; i <= jc;i++) //定义循环加 ...
- 大数问题:求n的阶乘
题目:求100! 这看起来是一个非常简答的问题,递归解之毫无压力 int func(int n){ if(n <= 1) return 1; else return n*func(n-1); } ...
- ARM汇编解决阶乘以及大小写转换
环境以及硬件 一.硬件仿真基于 SAMSUNG's S3C44B0X 16/32-bit RISC microprocessor 芯片,仿真器为 J-LINK 二.编写指令软件为 Integrated ...
- Java初学者作业——编写Java程序,输入一个数字,实现该数字阶乘的计算。
返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4* ...
- 【题解笔记】PTA基础6-10:阶乘计算升级版
题目地址:https://pintia.cn/problem-sets/14/problems/742 前言 咱目前还只能说是个小白,写题解是为了后面自己能够回顾.如果有哪些写错的/能优化的地方,也请 ...
- NYOJ-73 比大小 AC 分类: NYOJ 2014-01-17 21:29 195人阅读 评论(0) 收藏
典型的大数题目,这只是大数的比较,到时还有大数加减乘除,更加还有乘方,对于大数,一般用数组或者字符串,因为其他的结构类型一般都没有那么大 的范围!! 这道题目需要你仔细回想怎么比较俩个数字的大小,考虑 ...
- 2016年4月21百度iOS实习生在线笔试题&编程题
1.一个人上台阶可以一次上1个,2个,或者3个,问这个人上32层的台阶,总共有几种走法? 思路:先建立数学模型,设3步的走 i 次,2步的走 j 次, 1步的走 k 次,上了3*i + 2*j + 1 ...
- shell浅谈之十函数
转自:http://blog.csdn.net/taiyang1987912/article/details/39583179 一.简介 Linux Shell编 程中也会使用到函数,函数可以把大的命 ...
随机推荐
- Java Ant Could not find the main class: org.eclipse.ant.internal.launching.remote.InternalAntRunner. Program
参考:http://blog.csdn.net/jiangtaoking/article/details/49151763 The solution is to go to Run as → Exte ...
- HTML5 简介、HTML5 浏览器支持
HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定. HTML5的设计目的是为了在移动设备上支持多媒体. HTML5 简单易学. 什么是 HTML5? HTML5 ...
- Flex回声消除的最佳方法
Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提 ...
- Angularjs^1.2.9 搜索关键字高亮显示
需求分析: 根据关键字搜索网页内容,并且高亮显示内容中的关键字细节分析: 1.每次执行搜索操作,需清空上一次结果 2.需区分html标签和正常文本内容,否则为关键字添加样式以后会出现标签内容被显示的情 ...
- request.setAttribute和request.getAttribute还有session.setAttribute和session.getAttribute还有request.getParameter和request.getAttribute区别和联系
1.session.setAttribute()和session.getAttribute()配对使用,作用域是整个会话期间,在所有的页面都使用这些数据的时候使用. 2.request.setAttr ...
- android 获取适配的bitmap等相关
获取适配尺寸的图片: File files = new File(imagePath); FileInputStream is = null; BufferedInputStream bis = nu ...
- Python自然语言处理学习笔记之性别识别
从今天起开始写自然语言处理的实践用法,今天学了文本分类,并没用什么创新的东西,只是把学到的知识点复习一下 性别识别(根据给定的名字确定性别) 第一步是创建一个特征提取函数(feature extrac ...
- php in_array语法
bool in_array ( mixed $needle , array $haystack [, bool $strict ] ) 返回值为直或假 var_dump(in_array( ...
- Javascript—②函数
新手Perfect教程之Javascript②教程-函数 前言:上回我们是从hello world开始的,本期将会讲"函数" 在学自定义函数之前,先了解几个已经定义好的函数: 1 ...
- Angular2的模块架构浅谈
引言angular2相比1引入了更完善的模块系统,回忆ng1的应用中通常在页面的html标签或body标签中添加ng-app节点,值为应用的模块名,整个应用都将围绕这个模块来展开,到了ng2,模块概念 ...