读书人

面试题解决办法

发布时间: 2012-02-06 15:52:45 作者: rapoo

面试题
求1! + 2! + 3! + ... + 15!

[解决办法]
int N(int n)
{
for(int r=1;n> 1;n--)
r*=n--;
return r;
}

int calc(int n)
{
for(int r=0;n> 0;n--)
r+=N(n);
printf( "=%d\n ", r);
}

没执行过,应该八九不离十:)
[解决办法]
如果是C++,int是32位的,最大的无符号数是(unsigned int)0xffffffff == 4294967295(42.9亿),而12 's factorial is: 479001600, 13!大于42.9亿,所以不能直接用普通的算法来进行计算,可以用大数乘法来求每个数的阶乘,最后再把求得的值相加:
#include <iostream>
#include <list>

using namespace std;

// 按格式打印出数组中每个位置上的数字
void printNode(int n, int countPerElement) {
int size = 0;
int temp = n;
do {
temp = temp / 10;
size++;
} while (temp != 0);

for (int i = 0; i < countPerElement - size; i++) {
cout < < "0 ";
}
cout < < n < < " ";
}

int main() {
int maxPerElement = 100000; // 数组中每个元素的最大值 + 1
int countPerElement = 5; // 数组中每个元素的最大位数
int length = 101; // 数组长度
int result[101]; // 保存阶乘
int sum[101]; // 和的结果
for (int i = 0; i < length; i++) {
result[i] = 0;
sum[i] = 0;
}
result[length - 1] = 1;

int fact = 0; // 求阶乘的最大数
cout < < "Enter a num: ";
cin > > fact;
for (int i = 1; i <= fact; i++) {
int carry = 0;
int temp = 0;
// 求阶乘
for (int j = length - 1; j > 0; j--) {
temp = i * result[j] + carry;
result[j] = temp % maxPerElement;
carry = temp / maxPerElement;
}

carry = 0;
temp = 0;
// 求阶乘的和
for (int j = length - 1; j > 0; j--) {
temp = sum[j] + result[j] + carry;
sum[j] = temp % maxPerElement;
carry = temp / maxPerElement;
}
}

for (int i = 0; i < length; i++) {
printNode(sum[i], countPerElement);
}

return 0;
}

读书人网 >C语言

热点推荐