none
请教关于c#对于大数阶乘的算法 RRS feed

  • 问题

  • 就是例如需要计算1000!,如果利用基本数据类型会导致溢出。

     

    研究了一些网上的相关资料,可能是自己技术水平比较菜,看得不是很明白。只知道对于一个大数需要运用数组字符串进行存储,然后利用各个字符串进行乘法计算,或者自己构造一个大数类。但对于其中的具体细节是如何实现的本人还是有些茫然,请教高手帮忙。希望是通俗易懂的算法,附有注释,只讲实现的原理也行,但希望能够具体一点。非常感谢!

     

    这里有个相对简单的算法,但有些地方还不是很明白,希望高手能帮忙解释下红色部分。

    主要疑惑:(1)对于数组中的元素是一个数组元素存放一个一位数的数字还可以可以多位;(2)进位问题;

     

    代码:
    using System;
    class Program
          {
              static void Main()
              {
                  int n, i, j, x, s;
                  string qq;//用于控制循环的退出
                 
                  int[] a = new int[10000];//存放求出来的数
                  while (true)
                  {
                      int k;
                      //控制是否退出循环
                      Console.Write("是否退出,退出请输入q后回车,不退出请随意输入一个字符");
                      qq = Console.ReadLine();
                      if (qq == "q") break;
                      //读取n
                      Console.Write("求n!的值,最大可求3200!,请输入一个数字:");
                      n = int.Parse(Console.ReadLine());
                      a[0] = 1;
                      for (i = 1; i < 10000; i++) a[ i ] = 0;//给数组赋初始值
                      for (i = 1; i <= n; i++)
                      {
                          x = 0;
                          s = 0;
                          for (j = 0; j < 10000; j++)
                          {
                              x = i * a[j] + s;//乘积加上进位
                              a[j] = x % 10;//每个数组单项等于上面算得的数除以10的余数
                              s = x / 10;//求出进位用于下次相加
                          }
                      }
                      for (i = 9999; i >= 0; i--) if (a[ i ] > 0) break;
                      Console.WriteLine("结果:{0}!共有{1}位数", n, i + 1);//打印出结果共有几位
                      Console.Write("{0}!=", n);
                      for (j = i; j >= 0; j--) Console.Write(a[j]);//打印出结果
                      Console.WriteLine();
                  }
              }
          }

    2008年10月20日 4:34

答案

全部回复