问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2024-10-09 12:17

我来回答

3个回答

热心网友 时间:2024-10-09 13:01

如果需要精确计算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("带余短除申请临时内存发生错误!\n");
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\n", LInt2Str(buf, al, ah, 10, FALSE));

return 0;
}

热心网友 时间:2024-10-09 13:06

#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;
}

热心网友 时间:2024-10-09 13:07

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;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么描写小猫呢? 什么梦预示正缘要出现 壳外电场分布为什么与壳内电荷的位置无关啊 为什么带电球壳的内部场强处处为零? 电荷内或外感应球壳,球壳内部场强是否处处为零 win11回收站图标隐藏方法-win11回收站怎么隐藏 Windows 11回收站不见了怎么办_如何在Windows 11中恢复回收站图标 Win11回收站图标显示方法 win11显示回收站的方法_win11怎么显示回收站 华为荣耀5X评价,缺点,参数 c语言 ++x||++y&amp;&amp;++z 下列各组物质均能与盐酸反应并放出氢气的是( )A.Fe、Cu、ZnB.Zn、Fe... 怡可智能体成分分析仪联接方法 QQ主面板不显示怎么办 qq主面板面不显示 ...adobe indesign cs4adobe indesign未获得正确授权,现在即将退出。我... 怎么安慰一个刚失去亲人的人 请懂脚科疾病的同志们来看看:有瘀点! ...个在教室发生的小品剧本,除了那个考试疯云外,急用,谢了 求高人指点君越后排玻璃单层的能换成双层的吗? 君越关于装不装发动机护板的问题 君越avnier新车需要安装发动机护板跟底盘装甲吗? 购买君越需要要哪些配件。? 离婚了前妻不让看孩子怎么办呢 离婚前妻不让看孩子怎么处理 瓦屋山风景区玩什么 瓦屋山景区的景色怎么样? 北京师范大学珠海分校是什么时候建校的? 北京师范大学珠海分校是何时建校的? 好听的QQ名字 不要太长 可爱又拽一点的 谢啦 求:《黄河鬼棺》、《鬼吹灯-巫峡棺山》、《鬼吹灯-牧野诡事》、《盗 ... ...软的,走起路来有时会痛,可是跑步却不痛,这是什么啊? 窗户透光率多少合适 春秋战国时期,秦国的商鞅变法对于历史来讲是利还是弊,原因是什么_百度... 我的脚上长了2个泡,会少少突出,很硬的,中心有个小小的孔,走起路来会... win10安装KB3116869补丁失败且黑屏怎么办 我想提高自己的表达能力和随机应变能力,请问平时该怎么去练习?_百度... 我想练习自己的发音,希望说普通话时能说得有播音员一半那么好,不知道... 陕西锦泰魔芋产业发展有限公司怎么样? 勉县驿坝锦泰魔芋专业合作社怎么样? 陕西镇巴特产:镇巴花魔芋 陕西汉中特产:磨子桥魔芋粉丝 李姓发源地在哪里 ...现在已经裂到肉了走起路来很疼一瘸一瘸的,有什么办法能治好帮忙指点... word2007如何插入目录 描写人物表情的词语有什么 脚的第二个脚指头下面起了茧走起路很痛 游戏策划执行策划那些什么脚本程序编程也要自己写吗?真正在游戏公司里了... 干酵母是小苏打吗 怎样加入中国同学录中的班