xzc_yhxr @ 2023-08-30 07:52:08
#include<bits/stdc++.h>
using namespace std ;
int main(){
int s , v ;
scanf("%d %d" , &s , &v) ;
int need_time = ceil(s / v) + 10 ;
int have_time = 80 * 60 ;
need_time > have_time ? have_time += 24 * 60 : have_time *= 1 ;
have_time -= need_time ;
int hour = floor(have_time / 60) ;
int minute = have_time - hour * 60 ;
hour %= 24 ;
hour < 10 ? printf("%c%d" , '0' , hour) : printf("%d" , hour) ;
cout<<":";
minute < 10 ? printf("%c%d" , '0' , minute) : printf("%d" , minute) ;
return 0 ;
}
这个代码minute-=1就90,不加就10。错的点互补,什么问题
by AuCloud @ 2023-08-30 08:07:08
取整问题吧
by Nancy_Cherry @ 2023-08-30 08:56:43
在给定的代码中,问题出现在以下这行代码:
int minute = have_time - hour * 60 ;
这行代码计算分钟数时,应该是从剩余时间中减去已经计算过的小时数的分钟数。但是在这个代码中,have_time
已经减去了need_time
,即已经减去了需要的时间。因此,这里应该是减去hour * 60
的分钟数之后再减去1分钟,即:
int minute = have_time - (hour * 60 + 1);
这样就可以正确地计算剩余的分钟数了。
by Nancy_Cherry @ 2023-08-30 08:57:10
求关
by xzc_yhxr @ 2023-08-30 09:48:48
@Nancy_Cherry 下面写了,-=1就90wa , /dk
by Nancy_Cherry @ 2023-08-30 10:25:33
@xzc_yhxr az,尴尬了
我把我的代码给你看看
#include<bits/stdc++.h>
using namespace std;
int main() {
int x,y,h = 7,m = 50;
cin >> x >> y;
m = m - ceil((x * 1.0 / y));
while(m < 0) {
h--;
m += 60;
}
while(h < 0) h += 24;
if(h < 10) cout << "0";
cout << h << ":";
if(m < 10) cout << "0";
cout << m;
return 0;
}
by Nancy_Cherry @ 2023-08-30 10:46:27
改好了,你看看
#include<bits/stdc++.h>
using namespace std;
int main() {
int s, v;
scanf("%d %d", &s, &v);
int need_time = ceil(static_cast<double>(s) / v) + 10;
int have_time = 80 * 60;
if (need_time > have_time) {
have_time += 24 * 60;
}
have_time -= need_time;
int hour = have_time / 60;
int minute = have_time % 60;
hour %= 24;
hour < 10 ? printf("%c%d", '0', hour) : printf("%d", hour);
cout << ":";
minute < 10 ? printf("%c%d", '0', minute) : printf("%d", minute);
return 0;
}
对于表达式 s / v,s 和 v 都是整数类型,因此整数除法会导致结果被截断,得不到准确的商值。为了解决这个问题,我将 s 强制转换为 double 类型,使用浮点数除法来计算准确的商值。
然后最好不使用 printf 和 cout 两种不同的输出方式,可能导致输出结果混乱。
改都改了给个关注不过分吧
by xzc_yhxr @ 2023-08-30 21:13:21
@Nancy_Cherry 关了