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

作者&投稿:徭辰 (若有异议请与网页底部的电邮联系)
这道题C语言编程题我有一个测试点总是通不过,请问我错在哪?~

程序没问题啊,能正常输出:

你说的通不过,是编译器报的错吗?
附了一个代码,是一次性输入之后,然后一次性依次每行输出:


#include
#include

int main()
{

int N;
int height, weight;
int i;
double standard;
scanf("%d", &N);

int *data = (int*)malloc(2 * N * sizeof(int));
for (i = 0; i < 2 * N; i = i + 2)
{
scanf("%d %d", &data[i], &data[i + 1]);
}

for (i = 0; i < 2 * N; i = i + 2)
{
height = data[i];
weight = data[i + 1];

standard = (height - 100)*0.9 * 2;

if (weight > 0.9*standard&&weight < 1.1*standard)
printf("You are wan mei!
");
else
{
if (weight < standard)
printf("You are tai shou le!
");
else
printf("You are tai pang le!
");
}

}
system("pause");
return 0;

}

问题出在题目上所说的输入的整数小于10的500次方,你这样的读入方,怎么能够正常呢?
应该要,外层加一个无穷循环。然后,再用一层循环每次读入一个字符,把读到的字符转换为数字再累加,读到回车符时数字读入结束。如果得到的累加和是0,说明输入结束,退出循环。否则就按照你原来的处理方法进行

这段代码的问题在于图中红色框内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语言编程中,选择适当的数据类型很重要,需要根据数据范围合理选择。选择大了浪费内存,同时也增加了计算机计算负担;选择小了就会产生溢出得不到我们想要的结果。



你while循环里面每回删掉一个节点,不是报到3删除一个,所以缺少一个计算器,结果肯定不对,而且while(p->next=p)里面条件总是为真,所以循环不会出来。
望采纳!

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类型。

请大佬帮忙编一个c语言程序
答:键盘上输入数,然后排序的代码如下:include <stdio.h>int main(){ int i, j, a[100], m, n, temp; printf("输入数据数量:\n"); scanf("%d",&n); printf("输入%d个数据:\n",n); for (i=0; i<n; i++) scanf("%d", &a[i]); //选择排序 for (j...

大佬们,小白求请教这道c语言的题目咋编啊?
答:w没有初值哟,朋友!修改如下——代码资料:include "stdio.h"int main(int argc,char *argv[]){ int n=1,y;double s,m,x,w;scanf("%d",&y);while(s=0.0,y--){ if(scanf("%lf",&x)!=1 || x<=1){ printf("Input error, exit...\n");return 0;} for(n=1,m=x;(...

C语言编程,麻烦大佬们,谢啦
答:这道题目描述还不够清晰,如果输入的成绩可以是小数,就需要使用多个if语句实现,如下:include<stdio.h>int main( void ) { double score; scanf("%lf",&score); if(score>=90 && score<=100) printf("A\n"); else if(score>=80 && score<90) printf("B\n"); else if(score>=...

C语言编程题,输入三个整数,按从大到小的顺序输出
答:define _CRT_SECURE_NO_WARNINGS include<stdio.h> int main(){ int a,b,c,t;printf("请输入三个整数:\n");scanf("%d,%d,%d",&a,&b,&c);if(a<b){//完成a和b值的交换,a里面放最大值 t=a;a=b;b=t;} if(a<c){//完成a和c值的交换,a里面放最大值 t=a;a=c;c=t;}...

C语言编程题,求助大佬解答
答:include <iostream> using namespace std;struct Node { int elem;Node* next;};struct List { Node* head = NULL;};//查找前驱节点 Node* find_pre(List list, int elem){ if (!list.head) return NULL;Node* node = list.head;while (node->next && node->next->elem < elem) node...

大佬们求教这道c语言的题的答案,谢谢?
答:答案是:3。首先,注意大括号的位置,switch(b%2)其实是swith(a%3)的case:1的执行内容。一,判断a%3是1,所以执行:case 1:m++;switch(b%2){ default:m++;case 0:m++;break;} 这里switch(b%2),先执行了default,由于没有break语句,又无条件执行了case 0:的内容。所以共执行了3次m...

C语言编程,求大佬
答:include<stdio.h> void main() { char s[20]; int n, x;while ( 1 ) { scanf("%s", s); if (s[0]<'0' || s[0]>'9') break;if (s[0] == '0')if (s[1] == 'x') n = 16; else n = 8;else n = 10;if (n == 10) sscanf(s, "%d", &x);else if ...

求大佬解答,c语言编程题
答:include<stdio.h> void main(){ int a[10];int m=0,n=0; //这里 加上 m=0 int i;printf("please input a[i] ");for(i=0;i<10;i++) scanf("%d",&a[i]); // 下标用 i for(i=0;i<10;i++){if(a[i]<0) n=n+1;if(a[i]>=0) m=m+1; // 等于0 ...

求大佬帮我看一下这道C语言编程题哪里出错了
答:在键入了m之后,你又输入了回车,这个回车会被后面的循环语句里的回车判断语句接受,然后直接结束循环,一个字符也没有读入,可以选择在输入m后,直接输入字符串,或者把循环改为 scanf("%s",str);直接读入一个字符串str 然后用i = strlen(str); 可以获得字符串的长度 ...

一道c语言编程题,求大佬解答,求代码
答:include <stdio.h>#define N 15int fun(int a[]){int i,j,k,m=N;for(i=0;i<m-1;i++)for(j=i+1;j<m;j++)if(a[j]==a[i]){for(k=j;k<m-1;k++)a[k]=a[k+1];m--;i--;}return m;}void main(){int i,k,a[N];for(i=0;i<N;i++){scanf("%d",&a[i...