C中的数学输出不正确

C中的数学输出不正确,c,math,operators,C,Math,Operators,我正在“Sams自学C编程”第66页上编写这个非常简单和基本的脚本 基本上,脚本会要求您提供一些秒数。 您输入一个数字,然后它计算它们构成的时分和秒数 然后我对脚本进行了一些修改,以探索代码,使其不那么枯燥。 修改包括扩大可接受的输入和输出范围 在下面提供的代码中,我使用注释来表示原始代码、修改和添加 最后,在最后,我添加了一些注释来说明几个非常古怪的输出 ***表示计数的增量检查 ******表示由于输入的微小变化(即1位数),输出会发生剧烈变化 我第一次注意到这个问题是在我随机输入85000

我正在“Sams自学C编程”第66页上编写这个非常简单和基本的脚本

基本上,脚本会要求您提供一些秒数。
您输入一个数字,然后它计算它们构成的时分和秒数

然后我对脚本进行了一些修改,以探索代码,使其不那么枯燥。
修改包括扩大可接受的输入和输出范围

在下面提供的代码中,我使用注释来表示原始代码、修改和添加

最后,在最后,我添加了一些注释来说明几个非常古怪的输出

***
表示计数的增量检查
******
表示由于输入的微小变化(即1位数),输出会发生剧烈变化

我第一次注意到这个问题是在我随机输入
85000000

我已尽一切努力简化代码,使其更容易专注于数学。
我不确定是数学问题还是打字错误

不管怎样,代码如下:

/* Illustrates the modulus operator. */
/* inputs a number of seconds, and converts to hours, minutes, and seconds. */
// minute = 60 seconds                  : 60
// hour = 60 * 60 seconds               : 3600
// day = 24 * 60 * 60 seconds           : 86400
// year = 365 * 24 * 60 * 60 seconds    : 31536000

#include <stdio.h>                                      // from original script

/* Define constants */

#define SECS_PER_MIN 60                                 // from original script
#define MIN_PER_HOUR 60
#define HOURS_PER_DAY 24
#define DAYS_PER_YEAR 365
#define SECS_PER_YEAR 31536000
#define SECS_PER_HOUR 3600                              // from original script
#define SECS_PER_DAY 86400
#define LIMIT 2147438647

unsigned int seconds, minutes, hours, days, years, secs_remain, mins_remain, hours_remain, days_remain;     // modified from original script

int main(void)                                                                                          // from original script
{
    seconds = minutes = hours = days = years = secs_remain = mins_remain = hours_remain = days_remain = 0;
    /* Input the number of seconds. */

    printf( "Enter the number of seconds ( > 0, < %u ): \n", LIMIT );                  // modified from original script
    scanf( "%d", &seconds );                                                                            // from original script

    years = seconds /SECS_PER_YEAR;
    days = seconds / SECS_PER_DAY;
    hours = seconds / SECS_PER_HOUR;                                                                    // from original script
    minutes = seconds / SECS_PER_MIN;                                                                   // from original script
    days_remain = days / DAYS_PER_YEAR;      // ***missing 22643200 seconds, given input: 85000000***
    hours_remain = hours % HOURS_PER_DAY;
    mins_remain = minutes % MIN_PER_HOUR;                                                               // modified from original script
    secs_remain = seconds % SECS_PER_MIN;                                                               // from original script

    printf( "%u seconds is equal to ", seconds );                                                       // from original script

    if ( seconds < SECS_PER_HOUR )
    {
         printf( "%u m, and %u s\n", minutes, secs_remain );
         return 0;
    }
         else if((seconds >= SECS_PER_HOUR ) && (seconds < SECS_PER_DAY ))
         {
              printf( "%u h, %u m, and %u s\n", hours, mins_remain, secs_remain );                  // from original script
              return 0;                                                                             // from original script
         }    
         else if((seconds >= SECS_PER_DAY ) && (seconds < SECS_PER_YEAR ))
         {
              printf( "%u d, %u h, %u m, and %u s\n", days, hours_remain, mins_remain, secs_remain );
              return 0;
         }            
         else if((seconds >= SECS_PER_YEAR ) && (seconds < LIMIT ))
         {
             printf( "%u y %u d, %u h, %u m, and %u s\n", years, days_remain, hours_remain, mins_remain, secs_remain );  // calculation day's inaccurate
             return 0;
         }   
         else if(seconds > LIMIT )
         {
             printf("error: excessive amount of seconds.\n");
             printf("range for seconds must be between 0 and %u!\n", LIMIT );
             printf("If number of seconds exceeds %u, then it is beyond range for type 'int'.\n", LIMIT );
             printf("EXITING seconds program. \n");
             return 1;
         }
    }

// ERROR: 31536000 seconds is equal to 1 y 1 d, 0 h, 0 m, and 0 s
// ERROR: 63072000 seconds is equal to 2 y 2 d, 0 h, 0 m, and 0 s
// ERROR: 70000000 seconds is equal to 2 y 2 d, 4 h, 26 m, and 40 s                         ****
// ERROR: 78840000 seconds is equal to 2 y 2 d, 12 h, 0 m, and 0 s                          ****
// ERROR: 90000000 seconds is equal to 2 y 2 d, 16 h, 0 m, and 0 s                          ****
// ERROR: 92500000 seconds is equal to 2 y 2 d, 14 h, 26 m, and 40 s                        ****
// ERROR: 93750000 seconds is equal to 2 y 2 d, 1 h, 40 m, and 0 s                          ****
// ERROR: 94380000 seconds is equal to 2 y 2 d, 8 h, 40 m, and 0 s                          ****
// ERROR: 94537500 seconds is equal to 2 y 2 d, 4 h, 25 m, and 0 s                          ****
// ERROR: 94576875 seconds is equal to 2 y 2 d, 15 h, 21 m, and 15 s                        ****
// ERROR: 94596562 seconds is equal to 2 y 2 d, 20 h, 49 m, and 22 s                        ****
// ERROR: 94606406 seconds is equal to 2 y 2 d, 23 h, 33 m, and 26 s                        ****
// ERROR: 94607636 seconds is equal to 2 y 2 d, 23 h, 53 m, and 56 s                        ****
// ERROR: 94607943 seconds is equal to 2 y 2 d, 23 h, 59 m, and 3 s                         ****
// ERROR: 94607981 seconds is equal to 2 y 2 d, 23 h, 59 m, and 41 s                        ****
// ERROR: 94607990 seconds is equal to 2 y 2 d, 23 h, 59 m, and 50 s                        ****
// ERROR: 94607995 seconds is equal to 2 y 2 d, 23 h, 59 m, and 55 s                        ****
// ERROR: 94607998 seconds is equal to 2 y 2 d, 23 h, 59 m, and 58 s                        ****
// ERROR: 94607999 seconds is equal to 2 y 2 d, 23 h, 59 m, and 59 s                        ****    ****
// ERROR: 94608000 seconds is equal to 3 y 3 d, 0 h, 0 m, and 0 s                           ****    ****
// ERROR: 94608174 seconds is equal to 3 y 3 d, 0 h, 2 m, and 54 s                          ****
// ERROR: 94608097 seconds is equal to 3 y 3 d, 0 h, 1 m, and 37 s                          ****
// ERROR: 94608251 seconds is equal to 3 y 3 d, 0 h, 4 m, and 11 s                          ****
// ERROR: 94608867 seconds is equal to 3 y 3 d, 0 h, 14 m, and 27 s                         ****
// ERROR: 94611328 seconds is equal to 3 y 3 d, 0 h, 55 m, and 28 s                         ****
// ERROR: 94616250 seconds is equal to 3 y 3 d, 2 h, 17 m, and 30 s                         ****
// ERROR: 94695000 seconds is equal to 3 y 3 d, 0 h, 10 m, and 0 s                          ****
// ERROR: 95000000 seconds is equal to 3 y 3 d, 12 h, 53 m, and 20 s                        ****
// ERROR: 100000000 seconds is equal to 3 y 3 d, 9 h, 46 m, and 40 s                        ****
// ERROR: 122990400 seconds is equal to 3 y 3 d, 12 h, 0 m, and 0 s
// ERROR: 126144000 seconds is equal to 4 y 4 d, 0 h, 0 m, and 0 s
/*演示了模数运算符*/
/*输入秒数,并转换为小时、分钟和秒*/
//分钟=60秒:60
//小时=60*60秒:3600
//日=24*60*60秒:86400
//年份=365*24*60*60秒:31536000
#包含//来自原始脚本
/*定义常数*/
#从原始脚本定义每分钟60秒
#定义每小时最小值60
#定义每天24小时
#定义一年365天
#定义每学年的秒数31536000
#从原始脚本定义每小时3600/秒
#定义每天的秒数86400
#定义限制2147438647
未签名整数秒、分钟、小时、天、年、秒、分钟、小时、天;//从原始脚本修改
int main(void)//来自原始脚本
{
秒=分钟=小时=天=年=秒=分钟=小时=天=天=0;
/*输入秒数*/
printf(“输入秒数(>0,<%u):\n”,限制);//从原始脚本修改
scanf(“%d”,秒);//来自原始脚本
年=秒/秒/年;
天=秒/秒/天;
小时=秒/秒/小时;//来自原始脚本
分钟=秒/秒/分钟;//来自原始脚本
剩余天数=每年天数/天数;/***缺少22643200秒,给定输入:85000000***
剩余小时数=每天小时数百分比;
剩余分钟数=分钟%MIN\u每小时;//从原始脚本修改
secs\u remain=seconds%secs\u PER\u MIN;//来自原始脚本
printf(“%u秒等于”,秒);//来自原始脚本
如果(秒<秒/小时)
{
printf(“%u m,和%u s\n”,分钟,秒);
返回0;
}
否则如果((秒>=秒/小时)和&(秒<秒/天))
{
printf(“%u h、%u m和%u s\n”,小时,分钟,秒);//来自原始脚本
返回0;//来自原始脚本
}    
否则如果((秒>=秒/天)和&(秒<秒/年))
{
printf(“%u d、%u h、%u m和%u s\n”,天、小时、分钟、秒);
返回0;
}            
否则,如果((秒>=秒/年)和(&(秒<限制))
{
printf(“%u y%u d,%u h,%u m和%u s\n”,年,天,小时,分钟,秒);//计算日不准确
返回0;
}   
否则如果(秒>限制)
{
printf(“错误:秒数过多。\n”);
printf(“秒的范围必须在0和%u!\n之间”,限制);
printf(“如果秒数超过%u,则超出“int”类型的范围。\n”,限制);
printf(“退出秒程序。\n”);
返回1;
}
}
//错误:31536000秒等于1 y 1 d、0 h、0 m和0 s
//错误:63072000秒等于2 y 2 d、0 h、0 m和0 s
//错误:7000000秒等于2 y 2 d、4小时、26米和40秒****
//错误:78840000秒等于2 y 2 d、12 h、0 m和0 s****
//错误:90000000秒等于2 y 2 d、16小时、0米和0秒****
//错误:92500000秒等于2 y 2 d、14小时、26米和40秒****
//错误:93750000秒等于2 y 2 d、1小时、40米和0秒****
//错误:94380000秒等于2 y 2 d、8小时、40米和0秒****
//错误:94537500秒等于2 y 2 d、4小时、25米和0秒****
//错误:94576875秒等于2 y 2 d、15小时、21米和15秒****
//错误:94596562秒等于2 y 2 d、20小时、49米和22秒****
//错误:94606406秒等于2 y 2 d、23小时、33米和26秒****
//错误:94607636秒等于2 y 2 d、23小时、53米和56秒****
//错误
days_remain = days / DAYS_PER_YEAR;    // ***missing 22643200 seconds, given input: 85000000***
else if(seconds > LIMIT )
             {
                 printf("error: excessive amount of seconds.\n");
                 printf("range for seconds must be between 0 and %u!\n", LIMIT );
                 printf("If number of seconds exceeds %u, then it is beyond range for type 'int'.\n", LIMIT );
                 printf("EXITING seconds program. \n");
                 return 1;
              }