请问一下大佬们,这道C语言编程题我为什么错,还有这些监测点的划分依据是什么?

图一是题干,图二是我的答案,图三是提交结果。... 图一是题干,图二是我的答案,图三是提交结果。 展开
 我来答
格里编程办公技巧
科技发烧友

2021-08-17 · 编程、办公知识分享与学习
格里编程办公技巧
采纳数:434 获赞数:878

向TA提问 私信TA
展开全部

这段代码的问题在于图中红色框内jc数据类型不合适,不能定义为int,需为double。

解释

C语言中一般int为32位,最大只能表示12的阶乘,超过12就会产生溢出,而题目中明确说明了数据会在double范围内,就是有可能超过int所表示范围。需要改为double类型。

监测点划分依据

Cmn表示从n中选m个有多少情况,通过数学分析我们知道,当m=n/2时取得最大值。因为我们有公式只要m1+m2=n那Cm1n=Cm2n。所以这些监测点以n/2为分界点,用了三个范围内的数据进行测试。

错误分析

之所以在第二个范围内即为n/2时出错,原因可能是此时只有分子产生了溢出,而分母没有;其它两个数据范围内,虽然分子产生了溢出,但是碰巧分母也产生了溢出抵消了。要知道具体问题还得把真实数据拿出来看,并不是所有等于n/2的数据都是错的,只是有部分数据不通过测试。

另外通过了的数据范围也不一定都对,结果显示正确可能是数据样本不够全。

补充说明:

在C语言编程中,选择适当的数据类型很重要,需要根据数据范围合理选择。选择大了浪费内存,同时也增加了计算机计算负担;选择小了就会产生溢出得不到我们想要的结果。

炒饭君vip
2021-08-16 · TA获得超过2334个赞
知道小有建树答主
回答量:1.3万
采纳率:38%
帮助的人:914万
展开全部
你while循环里面每回删掉一个节点,不是报到3删除一个,所以缺少一个计算器,结果肯定不对,而且while(p->next=p)里面条件总是为真,所以循环不会出来。
望采纳!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pengjianbo311
2021-08-16 · TA获得超过464个赞
知道小有建树答主
回答量:1666
采纳率:36%
帮助的人:90.8万
展开全部
double fact(int n)
{
int i = 1;
double jc = 0;
if(n <= 0)
{
jc =1;
}
else
{
for(;i<=n;i++)
{
jc*=i;
}
}
return jc;
}
明显的问题是你的求阶乘函数中的变量jc应该定义为double类型。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式