如题所述
其实这个程序,用一个单重的循环就可以实现的:
#include <stdio.h>
int main()
{ long long i,t=1,s=1;
for(i=4; i<14; i+=3)
{ t*=i*(i-1)*(i-2);
s+=t;
}
printf("%lld\n",s);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2016-08-30
/* 因为13的阶乘,使用函数func()计算,超界,得到的数据是错误的,
* 所以,需要使用大数阶乘函数。
* 同理,楼上的代码,计算13的阶乘,也是错误的。
*/
#include <stdio.h>
#define LEN 20
long func(int n);
void fun(int n);
int num[LEN] = {0};
void add(long n, int src[], int dest[]);
int main()
{
long total = 0;
int array[20] = {0};
total = func(1) + func(4) + func(7) + func(10);
printf("1!+4!+7!+10!=%ld\n", total);
fun(13); /* 超限,使用大数阶乘函数 */
add(total, num, array); /* 求最终值 */
return 0;
}
long func(int n)
{ /* 小于等于10的数阶乘计算 */
int i = 1;
unsigned long sum = 1;
for (i = 1; i <=n; i++)
{
sum *= i;
}
// printf("%d的阶乘为:%ld\n", n, sum);
return sum;
}
void fun(int n)
{ /* 大数阶乘计算 */
int tmp = 0;
if (n == 0 || n == 1)
{
num[1] = 1;
}
else
{
num[1] = 1;
for(int i = 2; i<=n; i++)
{
for(int j = 1; j<sizeof(num)/sizeof(int); j++)
{
num[j] *= i;
}
for(int k = 1; k<sizeof(num)/sizeof(int); k++)
{
if(num[k] > 10)
{
tmp = num[k];
num[k] = num[k] % 10;
num[k+1] += tmp /10;
}
}
}
}
printf("%d!=", n);
int flag = 0;
for(int i = LEN; i>0; i--)
{
if (num[i] == 0 && flag == 0)
{ /* 不打印数组中无效的零 */
continue;
}
else
{
flag = 1;
printf("%d",num[i]);
}
}
printf("\n");
}
void add(long n, int src[], int dest[])
{ /* 将n和src[]逐位相加,存入dest[] */
int tmp[20] = {0};
int iNum = n;
int iIndex = 1;
while (1)
{
tmp[iIndex] = iNum % 10;
iNum /= 10;
iIndex++;
if (iNum == 0 || iIndex > LEN)
break;
}
for (int i = 1; i <= iIndex; i++)
{
int iTmp = src[i] + tmp[i] + dest[i];
if (iTmp > 9)
{ /* 处理进位 */
dest[i] = iTmp % 10;
dest[i+1] += 1;
}
else
{
dest[i] = iTmp;
}
}
for (int i = iIndex+1; i < LEN; i++)
dest[i] += src[i];
printf("++++++++++++++++\n和为:");
int flag = 0;
for(int i = LEN-1; i>0; i--)
{
if (dest[i] == 0 && flag == 0)
continue;
else {
flag = 1;
printf("%d",dest[i]);
}
}
printf("\n");
}
* 所以,需要使用大数阶乘函数。
* 同理,楼上的代码,计算13的阶乘,也是错误的。
*/
#include <stdio.h>
#define LEN 20
long func(int n);
void fun(int n);
int num[LEN] = {0};
void add(long n, int src[], int dest[]);
int main()
{
long total = 0;
int array[20] = {0};
total = func(1) + func(4) + func(7) + func(10);
printf("1!+4!+7!+10!=%ld\n", total);
fun(13); /* 超限,使用大数阶乘函数 */
add(total, num, array); /* 求最终值 */
return 0;
}
long func(int n)
{ /* 小于等于10的数阶乘计算 */
int i = 1;
unsigned long sum = 1;
for (i = 1; i <=n; i++)
{
sum *= i;
}
// printf("%d的阶乘为:%ld\n", n, sum);
return sum;
}
void fun(int n)
{ /* 大数阶乘计算 */
int tmp = 0;
if (n == 0 || n == 1)
{
num[1] = 1;
}
else
{
num[1] = 1;
for(int i = 2; i<=n; i++)
{
for(int j = 1; j<sizeof(num)/sizeof(int); j++)
{
num[j] *= i;
}
for(int k = 1; k<sizeof(num)/sizeof(int); k++)
{
if(num[k] > 10)
{
tmp = num[k];
num[k] = num[k] % 10;
num[k+1] += tmp /10;
}
}
}
}
printf("%d!=", n);
int flag = 0;
for(int i = LEN; i>0; i--)
{
if (num[i] == 0 && flag == 0)
{ /* 不打印数组中无效的零 */
continue;
}
else
{
flag = 1;
printf("%d",num[i]);
}
}
printf("\n");
}
void add(long n, int src[], int dest[])
{ /* 将n和src[]逐位相加,存入dest[] */
int tmp[20] = {0};
int iNum = n;
int iIndex = 1;
while (1)
{
tmp[iIndex] = iNum % 10;
iNum /= 10;
iIndex++;
if (iNum == 0 || iIndex > LEN)
break;
}
for (int i = 1; i <= iIndex; i++)
{
int iTmp = src[i] + tmp[i] + dest[i];
if (iTmp > 9)
{ /* 处理进位 */
dest[i] = iTmp % 10;
dest[i+1] += 1;
}
else
{
dest[i] = iTmp;
}
}
for (int i = iIndex+1; i < LEN; i++)
dest[i] += src[i];
printf("++++++++++++++++\n和为:");
int flag = 0;
for(int i = LEN-1; i>0; i--)
{
if (dest[i] == 0 && flag == 0)
continue;
else {
flag = 1;
printf("%d",dest[i]);
}
}
printf("\n");
}
第2个回答 2021-04-17
第3个回答 2016-08-30
#include <>
unsigned long fac(unsigned long n);
int main(void)
{
unsigned long sum,i;
for(i=1,sum=0;i<14;i+=3)
{
sum+=fac(i);
}
printf("%lu\n",sum);
return 0;
}
unsigned long fac(unsigned long n)
{
if(n)
return n*fac(n-1);
return 1;
}本回答被网友采纳
unsigned long fac(unsigned long n);
int main(void)
{
unsigned long sum,i;
for(i=1,sum=0;i<14;i+=3)
{
sum+=fac(i);
}
printf("%lu\n",sum);
return 0;
}
unsigned long fac(unsigned long n)
{
if(n)
return n*fac(n-1);
return 1;
}本回答被网友采纳