大数阶乘

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
 
输入
输入一个整数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的更多相关文章

  1. C 数组模拟阶乘运算

    #include <stdio.h> void rdump(int arr[],int len) { ; ;i >= ; --i) { printf("%d",a ...

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

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

  3. 大数问题:求n的阶乘

    题目:求100! 这看起来是一个非常简答的问题,递归解之毫无压力 int func(int n){ if(n <= 1) return 1; else return n*func(n-1); } ...

  4. ARM汇编解决阶乘以及大小写转换

    环境以及硬件 一.硬件仿真基于 SAMSUNG's S3C44B0X 16/32-bit RISC microprocessor 芯片,仿真器为 J-LINK 二.编写指令软件为 Integrated ...

  5. Java初学者作业——编写Java程序,输入一个数字,实现该数字阶乘的计算。

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4* ...

  6. 【题解笔记】PTA基础6-10:阶乘计算升级版

    题目地址:https://pintia.cn/problem-sets/14/problems/742 前言 咱目前还只能说是个小白,写题解是为了后面自己能够回顾.如果有哪些写错的/能优化的地方,也请 ...

  7. NYOJ-73 比大小 AC 分类: NYOJ 2014-01-17 21:29 195人阅读 评论(0) 收藏

    典型的大数题目,这只是大数的比较,到时还有大数加减乘除,更加还有乘方,对于大数,一般用数组或者字符串,因为其他的结构类型一般都没有那么大 的范围!! 这道题目需要你仔细回想怎么比较俩个数字的大小,考虑 ...

  8. 2016年4月21百度iOS实习生在线笔试题&编程题

    1.一个人上台阶可以一次上1个,2个,或者3个,问这个人上32层的台阶,总共有几种走法? 思路:先建立数学模型,设3步的走 i 次,2步的走 j 次, 1步的走 k 次,上了3*i + 2*j + 1 ...

  9. shell浅谈之十函数

    转自:http://blog.csdn.net/taiyang1987912/article/details/39583179 一.简介 Linux Shell编 程中也会使用到函数,函数可以把大的命 ...

随机推荐

  1. 在iOS微信浏览器中自动播放HTML5 audio(音乐)的2种正确方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. MongoDB安装环境搭建

    Mongodb的默认端口号27017 _id是全局唯一值,不要去给这个列赋值,默认是唯一的,如果赋值,列入有两列的_id:2,则会报冲突不能插入 [root@HE4 ~]# tar xvf mongo ...

  3. jQuery addClass removeClass toggleClass hasClass is(.class)用法

    jQuery addClass removeClass toggleClass hasClass is(.class)用法 <%@ page language="java" ...

  4. Flex 开发框架汇总

    1.现有成熟Flex框架   Cairngorm (Adobe Open Source) - MVC framework   PureMVC (Open Source) - MVC framework ...

  5. 在Eclipse中提交SVN项目的时候注意提交项目信息

    提交项目的时候,注意提交.classpath,.project和.settings文件夹: 这些是项目的信息,别人下载的时候才能正确显示为Eclipse项目:

  6. Redis key 相关命令

    其实本质上,Redis 就是一个Key---Value 数据库.这里我先介绍下Redis中关于的key的相关命令, 注意:key是字符串存储,但是不能使用 空格 或者 “\n”,value 则可以使用 ...

  7. 大大维的游戏机计划3--2048v1

    前几天由于忙着过年串门,游戏机的计划搁置了几天.这两天终于空出了一块时间,抽空写了2048. 由于笔者前面自制了一个类似2048的游戏,所以写起来也算是轻车熟路,花了两个晚上也就差不多了. 废话少说, ...

  8. MySQL管理命令

    1.验证MySQL安装 在成功安装Mysql后,一些基础表会表初始化,在服务器启动后,你可以通过简单的测试来验证Mysql是否工作正常. 使用 mysqladmin 工具来获取服务器状态: 使用 my ...

  9. jQuery的拾色器

    代码如下 1.js <link href="css/farbtastic.css" rel="stylesheet" /> <script t ...

  10. 表单界面的兼容PC手机端解决方案

    就当写一篇随笔吧~上星期还在做加盟模块(兼容微信端),这星期已经加班做快递扫码模块(react+node),所以我感觉只有弹药备足了才能稍微轻松些应对各种需求.实话说在同个部门的大佬面前差距确实大,如 ...