我无法理解解决方案中的m = ........行

时间:2018-04-23 10:28:56

标签: c

基本上问题是, 编写一个C程序将给定的整数(以秒为单位)转换为小时,分钟和秒。 测试数据 : 输入秒数:25300 预期产出: 有: H:M:S - 7:1:40

解决方案

#include <stdio.h>
int main() 
{
    int sec, h, m, s;
    printf("Input seconds: ");
    scanf("%d", &sec);

    h = (sec/3600); 

    m = (sec -(3600*h))/60;

    s = (sec -(3600*h)-(m*60));

    printf("H:M:S - %d:%d:%d\n",h,m,s);

    return 0;
}`

我无法理解m = .... line。因为我认为3600 * h实际上是's'而且(s-s)/ 60应该为零。我知道我错了,但你能用更简单的术语解释解决方案。

2 个答案:

答案 0 :(得分:3)

具有两个整数参数的除法运算符/执行积分除法:结果是整数。因此,除非sec完全被3600整除,否则

通常是正确的
sec != (sec / 3600) * 3600

确切地说,以下内容总是(1)

sec == (sec / 3600) * 3600 + (sec % 3600)

(1)正如@Bathsheba在评论中所指出的,&#34;总是&#34;不包括陷阱表示。因此,对于sec&#34;

中的所有有效数字,它实际上更像是&#34;

答案 1 :(得分:-1)

我将使用您的输入示例逐步写下来,但您遗漏的关键是所有变量都是整数(int)。整数不能保存十进制值,因此在进行整数除法时,小数部分会被切断(即数字被覆盖)。

所以sec = 25300

h = 25300/3600 = floor(7.02778) = 7
m = (25300-(3600*h))/60 = (25300-(3600*7))/60 = (25300-25200)/60 = floor(1.66667) = 1
s = (25300-(3600*h)-(m*60)) = (25300-(3600*7)-(1*60)) = floor(40.0) = 40

换句话说,在m=...行中,您将减去整个小时数(经过3600秒的次数)所具有的秒数< strong>总秒数,然后您将这些秒数除以60以获得完整分钟数(60秒过去的次数)。< / p>

注意:我使用过floor,因为这是发生在这里的事情的等效数学函数,但是将十进制数切成整数的正确术语是trunc