我必须打印系列: -
n*(n-1),n*(n-1)*(n-2),n*(n-1)*(n-2)*(n-3),n*(n-1)*(n-2)*(n-3)*(n-4)...,n!.
问题是n的值很大,它可以达到37和n!显然会走出界限? 我只是不能开始,请帮助,如果你在我的位置,你将如何解决问题?
答案 0 :(得分:3)
这取决于您使用的语言。当数字对于机器的本机整数表示而言太大时,某些语言会自动切换到大整数包。在其他语言中,只需使用一个大的整数库,它应该处理37!容易。
维基百科对某些语言有list of arbitrary-precision arithmetic libraries。网上还有很多其他资源。
答案 1 :(得分:1)
3岁的问题看起来很有趣。
简单创建一个例程,用因子“乘以”字符串。效率不高,但还是完成了工作。
#include <stdlib.h>
#include <string.h>
void mult_array(char *x, unsigned factor) {
unsigned accumulator = 0;
size_t n = strlen(x);
size_t i = n;
while (i > 0) {
i--;
accumulator += (unsigned)(x[i]-'0')*factor;
x[i] = (char) (accumulator%10 + '0');
accumulator /= 10;
}
while (accumulator > 0) {
memmove(x+1, x, ++n);
x[i] = (char) (accumulator%10 + '0');
accumulator /= 10;
}
}
#include <stdio.h>
void AS_Factorial(unsigned n) {
char buf[1000]; // Right-size buffer (problem for another day)
sprintf(buf, "%u", n);
fputs(buf, stdout);
while (n>1) {
n--;
mult_array(buf, n);
printf(",%s", buf);
}
puts("");
}
样本用法和输出
int main(void) {
AS_Factorial(5);
AS_Factorial(37);
return 0;
}
5,20,60,120,120
37,1332,46620,1585080,52307640,1673844480,...,13763753091226345046315979581580902400000000
答案 2 :(得分:0)
我刚刚在Java中试过BigInteger并且它有效。
用于演示目的的工作代码:
import java.math.BigInteger;
public class Factorial {
public static int[] primes = {2,3,5,7,11,13,17,19,23,29,31,37};
public static BigInteger computeFactorial(int n) {
if (n==0) {
return new BigInteger(String.valueOf(1));
} else {
return new BigInteger(String.valueOf(n)).multiply(computeFactorial(n-1));
}
}
public static String getPowers(int n){
BigInteger input = computeFactorial(n);
StringBuilder sb = new StringBuilder();
int count = 0;
for (int i = 0; i < primes.length && input.intValue() != 1;) {
BigInteger[] result = input.divideAndRemainder(new BigInteger(String.valueOf(primes[i])));
if (result[1].intValue() == 0) {
input = input.divide(new BigInteger(String.valueOf(primes[i])));
count++;
if (input.intValue() == 1) {sb.append(primes[i] + "(" + count + ") ");}
} else {
if (count!=0)
sb.append(primes[i] + "(" + count + ") ");
count = 0;
i++;
}
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(getPowers(37));
}
}
如果您愿意,可以随意使用它而不必担心版权。
更新:我直到现在才意识到您正在使用C ++。在这种情况下,您可以尝试boost BigInteger。
答案 3 :(得分:0)
您可以使用大整数,但是这仍有一些限制,但即使这样,此数据类型也可以处理非常大的值。大整数可以容纳的值,范围从
-9223372036854775808到9223372036854775807为有符号的整数,并且
无符号大整数的0到18446744073709551615。
如果你真的打算做一些比大整数数据类型更大的值计算,为什么不试试GMP library?
从网站所说的内容来看,“GMP是一个免费的库,用于任意精度算术,对有符号整数,有理数和浮点数进行操作。除了可用内存所暗示的精度之外,精度没有实际限制。在机器GMP上运行.GMP具有丰富的功能,并且功能具有常规接口。“ - gmplib.org
答案 4 :(得分:0)
如果不允许使用任何第三方库,则可以实现自己的大整数类型。你可以这样做:
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
const int base = 1000 * 1000 * 1000; // base value, should be the power of 10
const int lbase = 9; // lg(base)
void output_biginteger(vector<int>& a) {
cout << a.back();
for (int i = (int)a.size() - 2; i >= 0; --i)
cout << setw(lbase) << setfill('0') << a[i];
cout << endl;
}
void multiply_biginteger_by_integer(vector<int>& a, int b) {
int carry = 0;
for (int i = 0; i < (int)a.size(); ++i) {
long long cur = (long long)a[i] * b + carry;
carry = cur / base;
a[i] = cur % base;
}
if (carry > 0) {
a.push_back(carry);
}
}
int main() {
int n = 37; // input your n here
vector<int> current(1, n);
for (int i = n - 1; n >= 1; --n) {
multiply_biginteger_by_integer(current, i);
output_biginteger(current);
}
return 0;
}