读书人

求1000的阶乘解决方案

发布时间: 2012-02-01 16:58:19 作者: rapoo

求1000的阶乘
如何算出1000的阶乘

[解决办法]
本想简单胡乱的测试一下,但花了很长时间

Java code
public class Test {    static int[] v = new int[500];    static int ten = 0;    static int length = 1;    public static void m(int t) {        while (t%10==0) {            t /= 10;            ten++;        }        for (int i=0; i<length; i++) v[i]*=t;        int value;        for (int i=0; i<length; i++) {            value = v[i];            v[i] = 0;            t = i;            while (value>0) {                if (length==t) length++;                v[t] = v[t]+value%1000000;                value /= 1000000;                t++;            }        }    }        public static void n(int t) { for (int i=1; i<=t; i++) m(i); }    public static void main(String[] args) {        v[0] = 1;        long time = System.currentTimeMillis();        n(1000);        System.out.println(System.currentTimeMillis()-time);        int i=v.length-1;        while (v[i]==0) i--;        for (; i>-1; i--) {            System.out.print(v[i]/100000);            System.out.print(v[i]/10000%10);            System.out.print(v[i]/1000%10);            System.out.print(v[i]/100%10);            System.out.print(v[i]/10%10);            System.out.print(v[i]%10);        }        for (i=0; i<ten; i++) {            System.out.print('0');        }    }}
[解决办法]
给出程序代码和输出结果,来这里是研究程序的,不是来吵架的.
Java code
class PowerOf1000{  public static void main(String[] args)  {    int[] digits = new int[2568];    int max_digit = 2567;    digits[max_digit] = 1;    for (int d=2;d<=1000;d++)    {      for (int k=max_digit; k<digits.length; k++)        digits[k] *= d;      int k = digits.length-1;      while (k>=max_digit)      {        if (digits[k]>10)        {          digits[k-1] += digits[k] / 10;          digits[k] = digits[k] % 10;          if (k-1<max_digit) max_digit = k-1;        }        k--;      }    }    for (int i=max_digit; i<digits.length; i++)    {      System.out.print(digits[i]);    }    System.out.println();  }}
[解决办法]
数值计算基础问题。给个计算1! + 2! + ... + n!的,O(n*n)
C/C++ code
//calculate 1! + 2! + ... + n! where n is a positive integer#include <iostream>using namespace std;const long maxlen = 100000;int main(){    cout << "Input n: ";    int n = 0;    cin >> n;    cout << "1! + 2! + ... + " << n << "! = ";        int result[maxlen] = {0}, len_r = 0;    int temp[maxlen] = {0}, len_t = 0;        temp[0] = 1;    len_t = 1;        for (int x = 1; x <= n; x++)    {        temp[0] = temp[0] * x;        for (int j = 1; j < len_t; j++)        {            temp[j] = temp[j] * x + temp[j-1] / 10;            temp[j-1] = temp[j-1] % 10;        }                    while (temp[len_t-1] > 10)        {            temp[len_t] = temp[len_t-1] / 10;            temp[len_t-1] = temp[len_t-1] % 10;            len_t++;        }                for (int i = 0; i < len_t; i++)        {            result[i] = result[i] + temp[i];            result[i+1] = result[i+1] + result[i] / 10;            result[i] = result[i] % 10;        }                len_r = len_t;        while (result[len_r] > 0)        {            result[len_r+1] = result[len_r] / 10;            result[len_r] = result[len_r] % 10;            len_r++;        }            }        int k = len_r - 1;    while (result[k] == 0 && k > 0) k--;    for (; k >= 0; k--) cout << result[k];    cout << endl << endl << "Total Digits: " << len_r << endl;    return 0;}
------解决方案--------------------


给你一个关于求PI的任意高阶精度值得算法,你看看里面的方法!
#include <iostream>
#include <fstream>
#include <ctime>
#include "windows.h"
using namespace std;

void arctg(int * arctgx, int x, int len)
{
int n = 1, s = 1,c = 4,d = 0;
int i, *t, *a, eps = 0;
t = new int[len+1];
a = new int[len+1];
for(i=0;i<len;i++)
{
t[i] = c / x;
d = c % x;
c = d*10;
}
while(eps<len-1)
{
d = 0;
for(i=0;i<len;i++)
{
c = t[i]+d*10;
a[i] = c / n;
d = c % n;
}
for(i=1;i<len;i++)
{
if (a[i])
{
eps = i;
break;
}
else eps++;
}
if(s==1)
{
for(i=len-1;i>0;i--)
{
c = arctgx[i] + a[i];
arctgx[i] = c%10;
arctgx[i-1]+= c/10;
}
}
else
{
for(i=len-1;i>0;i--)
{

arctgx[i]-=a[i];
if (arctgx[i]<0)
{
arctgx[i] += 10;
arctgx[i-1]-=1;
}
}
}
n = n+2;
s = -s;
d = 0;
for(i=0;i<len;i++)
{
c = t[i]+d*10;
t[i] = c / x;
d = c % x;
}
d = 0;
for(i=0;i<len;i++)
{
c = t[i]+d*10;
t[i] = c / x;
d = c % x;
}
}
delete []t;
delete []a;
}


int main()
{
DWORD dwStart,dwStop;//调用系统功能来计时
dwStart=GetTickCount();//开始计时
int c, d, len;
int decimal, *arctg5, *arctg239, *pi;
cout << "请输入所要计算的π的精度值:";
cin >> decimal;
len = decimal+10;
arctg5 = new int[len+1], arctg239 = new int[len+1], pi = new int[len+1];
cout << "计算进行中,请稍等……" << endl;
for(int i=0;i<len;i++)
{
arctg5[i] = 0;
arctg239[i] = 0;
}
arctg(arctg5, 5, len);
arctg(arctg239, 239, len);
d = 0;
for(i=len-1;i>=0;i--)
{
c = arctg5[i]*4 + d;
pi[i] = c % 10;
d = c / 10;
}
delete []arctg5;
for(i=len-1;i>0;i--)
{
pi[i]-=arctg239[i];
if (pi[i]<0)
{
pi[i] += 10;
pi[i-1]-=1;
}
}
delete []arctg239;
cout<< "π= " << pi[0] << '.';
for(i=1;i<=decimal;i++)
{
cout<<pi[i];
}
delete []pi;
dwStop=GetTickCount();//计时结束
cout<<endl;
cout<<"计算用时:"<<(double)(dwStop-dwStart)/1000<<"秒"<<endl;
return 0;
}

[解决办法]
自定义数据类型&运算符重载


以下是C#的实现,转成java就成,运算符重载那块可用一个方法代替!

C# code
struct SuperNumber{    //底数    public double Num;    //指数    public int Index;    public static SuperNumber operator *(SuperNumber sn1,SuperNumber sn2)    {        SuperNumber sn=new SuperNumber();        sn.Num=sn1.Num*sn2.Num;        sn.Index=sn1.Index+sn2.Index;        where(sn.Num>10)        {            sn.Num/=10;            sn.Index++;        }        return sn;    }        public override string ToString()    {        return Num.ToString()+" X 10 的"+Index+"次方";    }}class Program{    SuperNumber tmp=new SuperNumber();    SuperNumber sn=new SuperNumber();    sn.Num=1;    sn.Index=0;        for(int i=2;i<=800;i++)    {        tmp.Number=i;        sn=sn*tmp;    }    System.Console.WriteLine(sn.ToString());        System.Console.ReadKey();}
[解决办法]
网上还有 4 行的 C 代码。那个叫牛。
下面是我弄的。

Java code
import java.util.Arrays;import java.text.DecimalFormat;/** * 求 1000 阶乘(用自定义的 BigInteger) */public class TestBigInteger {    public static void main(String[] args) {        BigInteger i = new BigInteger(1);        for (int n = 2; n <= 1000; n++) {            i.multiply(n);        }        System.out.println(i);        System.out.println(i.toString().length());    }}// 自定义的 BigIntegerclass BigInteger {    // 初始化数组。每个元素可以包含 9 位数字,所以初始化有 90 位    private int ints[] = new int[10];    // 达到或超过这个值就进位    private static final int UPPER_BOUND = 1000000000;    public BigInteger(int value) {        ints[0] = value;    }    public BigInteger(BigInteger value) {        ints = Arrays.copyOf(value.ints, value.ints.length);    }    public void multiply(int n) {        BigInteger that = new BigInteger(this);        for (int i = 0; i < n - 1; i++) {            add(that);        }    }    private void add(BigInteger bigInteger) {        int[] ints2 = bigInteger.ints;        for (int i = 0; i < ints2.length; i++) {            ints[i] += ints2[i];            checkAndCarry(i);        }        checkAndIncrease();    }    // 检查指定位置的值。有必要的话就进位。    private void checkAndCarry(int i) {        if (ints[i] >= UPPER_BOUND && i < ints.length - 1) {            ints[i] -= UPPER_BOUND;            ints[i + 1]++;        }    }    // 检查最后一个元素的值。达到或超过进位大小则增加数组长度。    private void checkAndIncrease() {        if (ints[ints.length - 1] > UPPER_BOUND) {            int[] newints = Arrays.copyOf(ints, ints.length + 1);            newints[ints.length - 1] -= UPPER_BOUND;            newints[ints.length]++;            ints = newints;        }    }    @Override    public String toString() {        DecimalFormat f = new DecimalFormat("000000000");        StringBuffer sb = new StringBuffer();        for (int each : ints) {            sb.insert(0, f.format(each));        }        while (sb.charAt(0) == '0') {            sb.delete(0, 1);        }        return sb.toString();    }} 

读书人网 >J2SE开发

热点推荐