刚会写一个算数学题的小程序就漏洞百出。
没错,还是那个抓着 独立性检验 不放的我{:10_266:}。今天我把程序完善了一下,这是第一版:
#include <stdio.h>
int main()
{
long long int a;
long long int b;
long long int c;
long long int d;
long long int n;
float k2;
printf("欢迎使用心鲜旅人自制独立性检验程序!\n");
printf("请输入a:");
scanf("%I64d",&a);
printf("请输入b:");
scanf("%I64d",&b);
printf("请输入c:");
scanf("%I64d",&c);
printf("请输入d:");
scanf("%I64d",&d);
n = a + b + c + d;
k2 = 1.0 * n * (a * d - b * c) * (a * d - b * c) / ((a + b) * (c + d) * (a + c) * (b + d));
printf("K2 = %.3f\n",k2);
if (k2 >= 0.455 && k2 < 0.708)
{
printf("P(%.3f >= 0.455) = 0.50",k2);
}
else if (k2 >= 0.708 && k2 < 1.323)
{
printf("P(%.3f >= 0.708) = 0.40",k2);
}
else if (k2 >= 1.323 && k2 < 2.072)
{
printf("P(%.3f >= 1.323) = 0.25",k2);
}
else if (k2 >= 2.072 && k2 < 2.706)
{
printf("P(%.3f >= 2.072) = 0.15",k2);
}
else if (k2 >= 2.706 && k2 < 3.841)
{
printf("P(%.3f >= 2.706) = 0.10",k2);
}
else if (k2 >= 3.841 && k2 < 5.024)
{
printf("P(%.3f >= 3.841) = 0.05",k2);
}
else if (k2 >= 5.024 && k2 < 6.635)
{
printf("P(%.3f >= 5.024) = 0.025",k2);
}
else if (k2 >= 6.635 && k2 < 7.879)
{
printf("P(%.3f >= 6.635) = 0.010",k2);
}
else if (k2 >= 7.879 && k2 <10.828)
{
printf("P(%.3f >= 7.879) = 0.005",k2);
}
else if (k2 >= 10.828)
{
printf("P(%.3f >= 10.828) = 0.001",k2);
}
else if (k2 >= 0 && k2 < 0.455)
{
printf("P(%.3f < 0.455) < 0.50(我也只能这样说了)",k2);
}
else
{
printf("负的???!!你丫的逗我呢!!!");
}
return 0;
}
最初,用起来还不错,之后又改了一版:
#include <stdio.h>
int main()
{
unsigned long long int a;
unsigned long long int b;
unsigned long long int c;
unsigned long long int d;
unsigned long long int n;
float k2;
printf("欢迎使用心鲜旅人秘制独立性检验小程序!\n");
printf("请输入a:");
scanf("%I64u",&a);
printf("请输入b:");
scanf("%I64u",&b);
printf("请输入c:");
scanf("%I64u",&c);
printf("请输入d:");
scanf("%I64u",&d);
n = a + b + c + d;
k2 = 1.0 * n * (a * d - b * c) * (a * d - b * c) / ((a + b) * (c + d) * (a + c) * (b + d));
printf("K2 = %.3f\n",k2);
if (k2 >= 0.455 && k2 < 0.708)
{
printf("P(K2 >= 0.455) = 0.50");
}
else if (k2 >= 0.708 && k2 < 1.323)
{
printf("P(K2 >= 0.708) = 0.40");
}
else if (k2 >= 1.323 && k2 < 2.072)
{
printf("P(K2 >= 1.323) = 0.25");
}
else if (k2 >= 2.072 && k2 < 2.706)
{
printf("P(K2 >= 2.072) = 0.15");
}
else if (k2 >= 2.706 && k2 < 3.841)
{
printf("P(K2 >= 2.706) = 0.10");
}
else if (k2 >= 3.841 && k2 < 5.024)
{
printf("P(K2 >= 3.841) = 0.05");
}
else if (k2 >= 5.024 && k2 < 6.635)
{
printf("P(K2 >= 5.024) = 0.025");
}
else if (k2 >= 6.635 && k2 < 7.879)
{
printf("P(K2 >= 6.635) = 0.010");
}
else if (k2 >= 7.879 && k2 <10.828)
{
printf("P(K2 >= 7.879) = 0.005");
}
else if (k2 >= 10.828)
{
printf("P(K2 >= 10.828) = 0.001");
}
else
{
printf("P(K2 < 0.455) < 0.50(我也只能这样说了)");
}
return 0;
}
可这一版就崩了,算不出来正确答案。{:10_266:}
找了半天找不到bug,我就放弃了,反正第一版能用就行啦。{:10_250:}
可后来做了个题,是50 1000 75 1500,算出来是0.000,我就又崩溃了。{:10_266:}
这不能是取值问题吧,我都用了long long了啊。大神求解{:10_254:} 高中的独立性检验?没有问题啊,50 1000 75 1500算出来k2确实为零,说明没有把握判定两者有关联。 EthanHsiung 发表于 2020-3-1 12:00
高中的独立性检验?没有问题啊,50 1000 75 1500算出来k2确实为零,说明没有把握判定两者有关联。
抱歉,这写错了,是75.5,好啦{:10_281:}这个不是重点啦,我就是想问我第二版哪错了。 心鲜旅人 发表于 2020-3-1 16:00
抱歉,这写错了,是75.5,好啦这个不是重点啦,我就是想问我第二版哪错了。
是75.5的话,和定义的unsigned long long int长整型不一致,应该是这个原因。 EthanHsiung 发表于 2020-3-1 16:40
是75.5的话,和定义的unsigned long long int长整型不一致,应该是这个原因。
兄弟,这个我知道,这也是为啥我打错成75的原因,你换个数试试,结果的数能吓死你 心鲜旅人 发表于 2020-3-1 21:07
兄弟,这个我知道,这也是为啥我打错成75的原因,你换个数试试,结果的数能吓死你
我找了几道例题试了一下,结果没问题。可能是编译器不支持unsigned long long int EthanHsiung 发表于 2020-3-2 08:13
我找了几道例题试了一下,结果没问题。可能是编译器不支持unsigned long long int
{:10_284:}可兄弟,我这这套程序就能用啊
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long int sum =0;
unsigned long long int temp;
unsigned long long int weight;
int i;
for (i = 0; i < 64; i++)
{
temp = pow(2,i);
sum = sum + temp;
}
weight = sum / 25000;
printf("舍罕王应该给予达依尔%I64u粒麦子\n",sum);
printf("如果每25000粒麦子为1kg,那么应该给%I64u公斤麦子!\n",weight);
return 0;
}
页:
[1]