注册 登录
编程论坛 C语言论坛

计算浮点数相处的余,萌新求解

温柔 发布于 2019-10-28 20:54, 2227 次点击
题目描述】
计算两个双精度浮点数a和b的相除的余数,a和b都是双精度浮点数。这里余数(r)的定义是:a=k×b+r,其中k是整数,0≤r<b。

【输入】
输入仅一行,包括两个双精度浮点数a和b。

【输出】
输出也仅一行,a÷b的余数。

【输入样例】
73.263 0.9973
【输出样例】
0.4601

#include <stdio.h>
int main()
{
    double a,b;
    scanf("%lf %lf",&a,&b);
    int k=a/b;
    double r = a-k*b;
    printf("%.4lf",r);
    return 0;
}
不知道哪里错了
5 回复
#2
纯蓝之刃2019-10-28 21:13
你这个没问题啊,你为什么说错了呢?你那里是什么现象?
#3
温柔2019-10-28 21:37
回复 2楼 纯蓝之刃
在我的编译器上结果不错,但未通过:
测试点1    答案错误    280KB    3MS
测试点2    答案错误    284KB    2MS
测试点3    答案错误    276KB    2MS
测试点4    答案错误    276KB    2MS
测试点5    答案错误    288KB    2MS
测试点6    答案错误    292KB    3MS
测试点7    答案错误    276KB    2MS
测试点8    答案错误    280KB    2MS
测试点9    答案错误    276KB    2MS
测试点10    答案错误    284KB    2MS
#4
rjsp2019-10-29 08:57
你考虑负数了吗?
当说到“余数”时,就应该想到取余数有多种模式:
+7/-4 = -1 …… +3 还是 -2 …… -1 // C99时规定是前者,C99之前为实现定义
-7/+4 = -1 …… -3 还是 -2 …… +1 // C99时规定是前者,C99之前为实现定义
-7/-4 = +1 …… -3 还是 +2 …… +1 // C99时规定是前者,C99之前为实现定义

程序代码:
#include <stdio.h>
#include <math.h>

int main( void )
{
    double a,b;
    scanf( "%lf%lf", &a, &b );

    double r = fmod( a, b );
    if( r < 0 )
        r = fabs(b) + r;

    printf( "%.4f\n", r );
}

#5
温柔2019-10-30 08:33
回复 4楼 rjsp
还是不太懂 ,为什么
if (r<0)
{
r=fabs(b)+r;
}
#6
rjsp2019-10-30 09:43
回复 5楼 温柔
这是题目要求的呀 --- “这里余数(r)的定义是:a=k×b+r,其中k是整数,0≤r<b。”

你的代码,
int k=a/b;
double r = a-k*b;
先不管算法是否严谨,但你求出的 r 可能是负值,如果是负值就不符合题意了(0≤r<b)。

而什么情况下你的算法会得到负值,我已经给你例举出来了,见2楼
-7/+4 = -1 …… -3
-7/-4 = +1 …… -3
所以你得将 -3 转化为 +1,也就是:除数的绝对值 加上 你得到的那个负的余数。
1