求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(); }}