C语言编程题,求5!+16!+27!,定义函数求n! 用程序流程图表示出算法,代码编写带点注释。

作者&投稿:掌蔡 (若有异议请与网页底部的电邮联系)
C语言编程用递归函数求5!的流程图~

借用 SICP 的插图( fib 6 )如下,5的计算过程类似:

1、打开vs2017软件,新建c语言的工程,首先开头引入头文件,然后调用先调用一下求阶乘的函数和空的主函数,最下方定义prime函数用来求阶乘:

2、主函数中用scanf函数接受用户输入的的数字,接着将输入的数传入处理阶乘的函数中完成计算,最后输出打印结果。prime函数有一个参数,首先判断是否为正数,然后用prime函数自身乘以参数s,最后返回值即可完成:

3、将程序编译运行,弹出窗口输入任意的数,计算阶乘;这里输入7,得到结果是5040。以上就是C语言求阶乘的方法:

如果需要精确计算16和27的阶乘需要编写大整数计算,至少要实现大整数加法,大整数乘以短整数,大整数除以短整数,大整数转换为字符串用于显示结果。当然如果不需要精确计算可以使用浮点数来计算。

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <ctype.h>



typedef int            BOOL;

typedef unsigned short LINT_B;
typedef unsigned long  LINT_B2;
typedef LINT_B *       LINT;
typedef const LINT_B * CLINT;

#define TRUE           1
#define FALSE          0
#define BASE           0x10000ul
#define BASEDIV2       0x8000ul
#define BASEMINONE     0xFFFFul
#define DIGITLEN       64 // 当 DIGITLEN = 64 时可以实现200以内的阶乘
#define Max(a, b)      ((a) < (b) ? (b) : (a))
#define Rmldzrs(l, h)  do {while(*(--h) == 0); ++h; h = Max(l, h);} while(0);

const int sBitperdgt = sizeof(LINT_B) * 8;

// 复制大数
LINT copy(CLINT f, CLINT l, LINT x)
{
while(f != l) *x++ = *f++;
return x;
}

// 大数是否为0
inline BOOL isZero(CLINT l, CLINT h)
{
Rmldzrs(l, h);
return (l == h) ? TRUE : FALSE;
}

// 调换字符串的顺序
void reverse(char *s)
{
char t;
char *sl = s;
char *sh = sl + strlen(s);
while(sl < sh) {t = *sl; *sl++ = *(--sh) ; *sh = t;}
}

// 交换大数指针
void swapCLINT(CLINT *a, CLINT *b)
{
CLINT t;
t = *a; *a = *b; *b = t;
}

// 加法 C = A + B
LINT add(CLINT al, CLINT ah, CLINT bl, CLINT bh, LINT cl)
{
LINT_B2 carry = (LINT_B2)0;
LINT ch = cl;
if((ah - al) < (bh - bl)) swapCLINT(&al, &bl), swapCLINT(&ah, &bh); // 保证A的长度大于或等于B
// 两个数相加
while (bl < bh)
*ch++ = (LINT_B)(carry = (LINT_B2)*al++ + (LINT_B2)*bl++ + (LINT_B2)(LINT_B)(carry >> sBitperdgt));
// 处理 A 比 B 多出的长度
while (al < ah)
{
if(carry >= BASE) *ch++ = (LINT_B)(carry = (LINT_B2)*al++ + (LINT_B2)(LINT_B)(carry >> sBitperdgt));
else *ch++ = *al++;
}
// 处理进位
if(carry & BASE) *ch++ = (LINT_B)1;
return ch;
}

// 短乘法 C = A * b
LINT umul(CLINT al, CLINT ah, LINT_B b, LINT cl)
{
LINT     ch;
LINT_B2 *pc;
CLINT    pa;
LINT_B2  carry, bv;

if(b == 0 || isZero(al, ah)) {if(cl) *cl = 0; return cl;}
if(ah - al == 1) // A 的长度只有一个数字
{
pc  = (LINT_B2 *)cl;
*pc = (LINT_B2)*al * (LINT_B2)b;
ch = cl + 2;
Rmldzrs(cl, ch);
return ch;
}
ch = cl;
pa = al;
carry = (LINT_B2)0, bv = (LINT_B2)b;
// 循环计算
while(pa < ah) *ch++ = (LINT_B)(carry = bv * (LINT_B2)*pa++ + (LINT_B2)(LINT_B)(carry >> sBitperdgt));
// 处理进位
*ch++ = (LINT_B)(carry >> sBitperdgt);
Rmldzrs(cl, ch);
return ch;
}

// 短除 A = b * C + d
// cl 或 d 可以是空指针
LINT udiv(CLINT al, CLINT ah, LINT_B b, LINT cl, LINT d)
{
int lenA, lenC;
LINT    bufC = NULL, ch, pch;
LINT_B  c;
CLINT   pah;
LINT_B2 rdach, bv, rv;

// 处理特殊情况
if(b == 0)
{
printf("带余短除出现除以0错误");
if(d)  *d  = 0;
if(cl) *cl = 0; 
return cl;
}
lenA = ah - al;
if(lenA == 0) {if(d) *d = 0; if(cl) *cl = 0; return cl;} // 被除数等于0,结果商等于0,余数等于0
if(lenA == 1) // 被除数也只有1位
{
if(*al < b) {if(d) *d = *al; if(cl) *cl = 0;} // 被除数小于除数,商等于0,余数等于被除数
else
{
c = *al / b;
if(cl) *cl++ = c;
if(d)  *d    = *al - c * b;
}
return cl;
}

lenC = lenA - 1; // 计算长度
if(cl == NULL)
{
bufC = (LINT)malloc((lenC + 1) * sizeof(LINT_B)); // 申请内存,保证cl不为NULL
if(bufC == NULL)
{
printf("带余短除申请临时内存发生错误!
");
if(d) *d = 0;
return NULL;
}
cl = bufC;
}
ch = cl + lenC;

// 开始计算
pah = ah - 1;
pch = ch;
bv  = b, rv = 0;
while(al <= pah)
{
*pch = (LINT_B)((rdach = ((rv << sBitperdgt) + (LINT_B2)*pah--)) / bv);
rv   = (rdach - bv * (LINT_B2)*pch--);
}
if(d) *d = (LINT_B)rv;
if(bufC)
{
free(bufC);
return NULL;
}
return (*ch == 0) ? ch : ++ch;
}

// 大整数变成数字串
const char * LInt2Str(char * o, CLINT l, CLINT h, LINT_B base, BOOL uppercase)
{
const char * sVecUpper = "0123456789ABCDEF";
const char * sVecLower = "0123456789abcdef", *Vec;
char *po;

LINT_B x, t[DIGITLEN], ii[DIGITLEN];
LINT   th, tl, il, ih;
CLINT  xl, xh;
BOOL   flag = TRUE;

po  = o;
il  = ii;
ih  = copy(l, h, il);
Rmldzrs(il, ih);
if(isZero(il, ih))
{
*o++ = '0';
*o++ = 0;
return po;
}

Vec = uppercase ? sVecUpper : sVecLower;
xl  = &x;
xh  = xl + 1;
th  = tl = t;

switch(base)
{
case 2: case 8: case 10: case 16: break;
default: base = 10;
}

while(1)
{
if(flag)
{
th   = udiv(il, ih, base, tl, &x);
flag = FALSE;
}
else
{
ih   = udiv(tl, th, base, il, &x);
flag = TRUE;
}
*o++ = Vec[x];
if(th == tl || ih == il) break;
}
*o++ = 0;
reverse(po);
return po;
}

// 阶乘,可以精确计算200以内的阶乘,定义更大的DIGITLEN可以实现更大数字的阶乘
LINT jiecheng(LINT l, LINT_B x)
{
LINT h = l + 1, tl, th;
LINT_B i = 1, t[DIGITLEN];
BOOL   flag = TRUE;
*l = 1;
th = tl = t;

while(i <= x)
{
if(flag) {flag = FALSE; th = umul( l,  h, i++, tl);}
else     {flag =  TRUE; h  = umul(tl, th, i++,  l);}
}
if(!flag) h = copy(tl, th, l);
return h;
}

int main()
{
char buf[512];
LINT_B a[DIGITLEN], b[DIGITLEN], c[DIGITLEN], i = 5;
LINT al, ah, bl, bh, cl, ch;
ah = al = a, bh = bl = b, ch = cl = c;
while(i < 30)
{
printf("%d! ", i);
ch  = add(al, ah, bl, jiecheng(bl, i), cl);
ah  = copy(cl, ch, al);
i  += 11;
if(i < 30) printf("+ ");
}
printf("= %s
", LInt2Str(buf, al, ah, 10, FALSE));

return 0;
}


#include<stdio.h>
double fac(int n) //计算n的阶乘
{double x=1.0;
int i;
for(i=2;i<=n;i++)
x*=i;
return x;
}
int main()
{printf("%.0lf\n",fac(5)+fac(16)+fac(27));
return 0;
}

void main(void)
{
    uint sum;
    sum = f_JieCheng(n);
}
uint f_JieCheng(uint n)
{
    uint temp = 1;
    for(i=1;i<(n+1);i++)
    {
        temp *= i;  
    }
    return temp;
}



C语言编程:求5!。
int main(){ int s=1,i;for(i=1;i<=5;i++)s*=i;printf("%d\\n",s);return 0;}

c语言 编程实现递归方法求5!
写了一个函数求阶乘 输入5就能得出5的阶乘烦请采纳 谢谢 程序代码 include "stdafx.h"include <stdio.h> int fun(int n){ if(n==1) return 1;else return n*fun(n-1);} int main(int argc, char* argv[]){ int n;do { printf("请输入一个整数,输入0结束\\n");scanf("%d",&...

C语言编程计算5!+7!+9!+11!
include <stdio.h> unsigned long fac(int n){ if(n<2)return 1UL;return fac(n-1)*n;} int main(){ int i;unsigned long sum;for(sum=0,i=5;i<=11;i+=2)sum+=fac(i);printf("%lu\\n",sum);return 0;}

C语言编程题,求5!+16!+27!,定义函数求n! 用程序流程图表示出算法,代码...
#define TRUE 1#define FALSE 0#define BASE 0x10000ul#define BASEDIV2 0x8000ul#define BASEMINONE 0xFFFFul#define DIGITLEN 64 \/\/ 当 DIGITLEN = 64 时可以实现200以内的阶乘#define Max(a, b) ((a) < (b) ? (b) : (a))#define Rmldzrs(l, h) do {w...

C语言编程题,从键盘输入一个数,用函数调用求它的阶乘(如5!=120)
阶乘的结果,数值很大,要用double计算和存放。打印整数部分就可以了。include <stdio.h> double jc(int n){ int i;double x=1.0;for (i=1;i<=n;i++) x = x * (double) i;return x;} void main(){ int i,n;double x;printf("Please enter a number 1 to 10\\n");scanf("%d...

c语言编程 阶乘:编写函数求一个整数的阶乘,利用函数编程,计算:5!-2...
include <stdio.h>int fun(int n){if(n==1) return 1;return fun(n-1)*n;} int main(){printf("%d\\n",fun(5)-fun(2)+fun(4));}\/*运行结果:142*\/

c语言编程:使用for循环求解:1! + 3! + 5!
include "stdio.h"main(){ int i,j;int a = 1, s = 0;for(i=1;i<=5;i++){ a = a * i;if (i % 2 != 0)s = s + a;} printf("%d\\n", s);}

C语言编程:求五个数的最小公倍数
include <stdio.h>int lcm(int a,int b){int r,t=a*b; while(r=a%b) {a=b; b=r;} return t\/b;}int main(){ int a[5],i; for(i=0;i<5;i++) scanf("%d",&a[i]); for(i=1;i<5;i++) a[0]=lcm(a[0],a[i]); printf("%d\\n",a[0]); ret...

c语言编程计算1!+2!+3!+4!+5!(用for的双层循环),请教大家
说明:第一个for循环是分别提出进行阶乘的因数即分别提出1,2,3,4,5。第二个for循环是将提出的因数进行阶乘运算。在第一个for和第二个for之间加个n=1;是因为经过一次阶乘后n的值发生变化。(比如当i=2时,经过第2个for循环得到n等于2!的值,所以当i=3进行3!运算时需要将n重置为1.)sum...

c语言!5是什么意思
3<=x<=5 在数学中,是x大于等于3且小于等于5的意思,对应C语言中的 3<=x && x<=5 在c语言若错写成3<=x<=5 ,则判断时,这个式子是永真的,它先判断 3<=x 无论是否成立,其结果为0和1两种,真或假。而0和1都小于等于5,所以结果为真。

师宗县13478697430: C语言编程题,求5!+16!+27!,定义函数求n! 用程序流程图表示出算法,代码编写带点注释. -
阴姣润博: 如果需要精确计算16和27的阶乘需要编写大整数计算,至少要实现大整数加法,大整数乘以短整数,大整数除以短整数,大整数转换为字符串用于显示结果.当然如果不需要精确计算可以使用浮点数来计算.#include <stdio.h>#include <string.h...

师宗县13478697430: C语言编程求1!+2!+3!…+5! 的值 -
阴姣润博: #include <stdio.h> long func(int x) { int i; long s=1; for(i=1;i<=x;i++) s*=i; return s; } void main() { int a; long sum=0; printf("请输入要求的项数:"); scanf("%d",&a); for(int i=1;i<=a;i++) sum+=func(i); printf("The result is:%d\n",sum); }

师宗县13478697430: C语言编程:写一个程序使之储存下列数字15,22,16,18,27,23,20在一个数组中,使程序 -
阴姣润博: main(){int i,j,miles[7],dist[7]; miles[7]={15,22,16,18,27,23,20};for (i=0;i<7;i++) dist[i]=miles[i];for (i=0;i<7...

师宗县13478697430: C语言编程:求s=1 - 2+3 - 4+5……+99 - 100 -
阴姣润博: main() { int s=0; for(int i=1;i<101;i++) { if(i%2==0) i=-i; s+=i; } }

师宗县13478697430: C语言程序题 求5!+6!+7!+8!+9!+10!
阴姣润博: #include<stdio.h>void main() {int i,j,s,t;s=0;for(i=5;i<11;i++){t=1;for(j=1;j<=i;j++) t=t*j;s+=t;}printf("%d\n",s); }

师宗县13478697430: C语言编程:求1!+2!+3!+4!+5!+6!+7!+8!+9!(用for循环编写) -
阴姣润博: 9*9!还在int型范围内,而题设和要比9*9!小很多,所以用int型变量就可以准确解决.用一个for循环兼作求阶乘和求和两项功能,空间、时效都较经济.举例代码如下:#include "stdio.h" int main(int argc,char *argv[]){ int s,i,t; for(s=0,t=i=1;i<10;s+=t*=i++); printf("1!+2!+3!+...+9! = %d\n",s); return 0; }

师宗县13478697430: C语言程序高手请指点 -
阴姣润博: 我不知道你的8.391667是怎么算来的,正确答案n=5时,输出s=6,下面我们看每一步执行循环时各变量的值:k s c a b1 0 ? 2 1 这是循环开始前,各变量的初值1 2 2 3 3 第一次循环时,k=1不变,s=0...

师宗县13478697430: C语言编程题,急,非常感谢
阴姣润博: 第一题 main() { float n,s=0,t=1; for(n=1;n<=20;n++) { t*=n; s+=t; } printf("1+2!+3!...+20!=%e\n",s); } 第2题 main() { int i,j,k,n; printf("'water flower'number is:"); for(n=100;n<1000;n++) { i=n/100;/*分解出百位*/ j=n/10%10;/*分解出十位*/ k=n...

师宗县13478697430: C语言编程(2/1+3/2+5/3+8/5+13/8.....)20项目求和 -
阴姣润博: 123456789101112131415161718192021222324252627282930313233343536373839 #include<stdio.h> intmain() { inta1=2,a2=3,a3; intb1=1,b2=2,b3; inti; doublec1=2,c2,c3; printf("%d\n",c3);//很显然是运行到这一句就输出了c3的值,但是...

师宗县13478697430: 求助:C语言编程题 -
阴姣润博: 第一道题:#include<stdio.h> void main() { int a,b[5],i; printf("请输入一个五位整数:\n"); scanf("%d",&a); /*将输入的五位数赋给整型变量a*/ for(i=0;i<5;i++) { b[i]=a%10; a/=10; } /* 这个for循环的作用是将a从个位开始的每个数依次赋给整...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网