Chinaunix首页 | 论坛 | 博客
  • 博客访问: 408062
  • 博文数量: 121
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1393
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-11 12:17
个人简介

www.vibexie.com vibexie@qq.com

文章分类

全部博文(121)

文章存档

2015年(55)

2014年(66)

我的朋友

分类: C/C++

2014-04-07 18:52:20

用数组的方法解决大数、巨数的阶乘结果越界的问题。(不过这里的代码超出了C99标准。)


具体算法中有最朴实的乘法运算思想。


点击(此处)折叠或打开

  1. #include

  2. int main()
  3. {
  4.  
  5.  int n; //阶乘大小
  6.  printf("请输入n的大小:");
  7.  scanf("%d",&n); //从键盘接收阶乘大小
  8.  int a[200]; //确保保存最终运算结果的数组足够大
  9.  int carry; //进位
  10.  int digit = 1; //位数
  11.  a[0] = 1; //将结果先初始化为1
  12.  int temp; //阶乘的任一元素与临时结果的某位的乘积结果
  13.          
  14.  for(int i = 2; i <= n; ++i) //开始阶乘,阶乘元素从2开始依次“登场”
  15.  {
  16.          //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
  17.   for(int j = 1, carry = 0; j <= digit; ++j)
  18.   {
  19.    temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
  20.         a[j-1] = temp % 10; //更新临时结果的位上信息
  21.    carry = temp / 10; //看是否有进位
  22.   }
  23.   while(carry) //如果有进位
  24.   {
  25.    a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
  26.    carry /= 10; //看还能不能进位
  27.   }
  28.  }

  29.  printf("结果是:\n%d ! = ",n); //显示结果
  30.  for(int i = digit; i >=1; --i)
  31.  {
  32.   printf("%d",a[i-1]);
  33.  }
  34.  return 0;
  35. }
请输入n的大小:结果是:
100 ! = 93326215443944152681699238856266700490715968264381621468592963895217
5999932299156089414639761565182862536979208272237582511852109168640000000000
00000000000000
阅读(1424) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~