Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2115126
  • 博文数量: 249
  • 博客积分: 1305
  • 博客等级: 军士长
  • 技术积分: 4733
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-17 10:37
个人简介

不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。 欢迎关注微信公众号:菜鸟的机器学习

文章分类

全部博文(249)

文章存档

2015年(1)

2014年(4)

2013年(208)

2012年(35)

2011年(1)

分类: C/C++

2013-04-07 21:53:24


N!



Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
 

Input
One N in one line, process to the end of file.
 

Output
For each N, output N! in one line.
 

Sample Input

1
 2
3
 

Sample Output
1
 2
6
 
    
    题目解析
    本题目是求整数的阶乘,原来意识里求阶乘是相对比较简单的问题,但是,这里 1<= N <= 10000,求得的N!是大整数。因此,需要进行“特殊”的处理。
    其实,做完这道题目很高兴的,虽然过程比较纠结,对于ACM的格式以及对大整数阶乘的处理不是很熟,所以,学到了很多。
   
   代码如下:

  1. #include <stdio.h>
  2. #include <string.h>

  3. #define MAXNUM 50000    //这个最小应该多大呢?开始时开小了

  4. int main(int argc, char* argv[])
  5. {
  6.     int n;    //    测试用例个数
  7.     int i, j;
  8.     int a[MAXNUM];
  9.     int digit = 0;    //当前数组的大小
  10.     int carry = 0;    //进位
  11.     int tmp;
  12.     while(scanf("%d", &n) != EOF)
  13.     {
  14.         //初始化
  15.         memset(a, 0, sizeof(a));
  16.         a[0] = 1;
  17.         digit = 1;
  18.         //把0的阶乘当作1的阶乘来处理
  19.         if(n == 0)
  20.         {
  21.             n = 1;
  22.         }
  23.         for(i = 1; i <= n; i++)
  24.         {
  25.             carry = 0;
  26.             for(j = 0; j < digit; j++)
  27.             {
  28.                 tmp = a[j] * i + carry;    //开始时忘记加进位carry了!!!!
  29.                 carry = tmp / 10;        
  30.                 a[j] = tmp % 10;        
  31.             }
  32.             //如果运算最后有进位,则处理进位
  33.             if(carry)
  34.             {
  35.                 while(carry)
  36.                 {
  37.                     //j++; //开始这里出问题了
  38.                     a[j] = carry % 10;
  39.                     j++;                
  40.                     carry = carry / 10;
  41.                     digit = j;    //获取当前数组的大小
  42.                 }
  43.             }
  44.         }
  45.         for(i = digit - 1; i >= 0; i--)
  46.         {
  47.             printf("%d", a[i]);
  48.         }
  49.         printf("\n");
  50.     }

  51.     return 0;
  52. }



    
阅读(1326) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~