打印

呵呵,动脑筋的算法请教了(C语言)

[复制链接]
1980|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
center|  楼主 | 2009-8-6 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
给出一个总的分钟数 unsigned long  tminute; ,  如tminute 是65230;
想求得这个分钟数是**年**月**日**时**分00秒.

这个日期的时间是以2000年01月01日00时00分00秒为起始算的.
//当然秒是不考虑的.

最后的日期,存储在TIME_BCD[0]; //年
                        TIME_BCD[1]; //月
                        TIME_BCD[2]; //日
                        TIME_BCD[3]; //时
                        TIME_BCD[4];//分
                        TIME_BCD[5]=0x00;//秒
/////
void   get_bcdtime(unsigned long tminute)
         {
         }

相关帖子

沙发
center|  楼主 | 2009-8-6 10:08 | 只看该作者
2楼朋友,关键还要考虑闰年的问题

使用特权

评论回复
板凳
gavin_li| | 2009-8-6 12:57 | 只看该作者
闲着无事,用VC进行了简单的编程。
#include "stdafx.h"

#define YYearMinute (366*24*60)
#define NYearminute (365*24*60)
#define Month31 (31*24*60)
#define Month30 (30*24*60)
#define Month28 (28*24*60)
#define Month29 (29*24*60)
#define Day (24*60)
#define Hour 60

unsigned long tminute = 65230;
unsigned char TIME_BCD[6];

void get_bcdtime()
{
        int i = 1;
        int left=tminute;
        char flag ='N';

        //get year
        while ( left >= NYearminute ){
        //it is better using a function to check if the year is a leap year or not
                if ( (TIME_BCD[0]==0x00) || (TIME_BCD[0]==0x04) || (TIME_BCD[0]==0x08) ){
                        flag ='Y';

                        if (left>=YYearMinute){
                       left = left - YYearMinute;
                        }
                        else break;                    
                }
                else{
           left = left - NYearminute;
                   flag ='N';
                }

        TIME_BCD[0]=TIME_BCD[0]+0x01;

        }
        //get month
        for (;i<=12;i++){
                if ( (left>=Month30) || (left>=Month31) ){
                   if ( (i==1) || (i==3) || (i==5) || (i==7) || (i==8) || (i==10) || (i==12) ){
                       left = left - Month31;
                   }
                   else if ( i==2 ){
                           flag=='Y' ? (left=left-Month29):(left=left-Month28);
                   }
                   else{
                           left = left - Month30;
                   }

                   TIME_BCD[1]=TIME_BCD[1]+0x01;
                }
                else break;
        }

        //get day
        while(left>=Day){
        left = left - Day;
                TIME_BCD[2]=TIME_BCD[2]+0x01;
        }

        //get hour
        while(left>=Hour){
        left = left - Hour;
                TIME_BCD[3]=TIME_BCD[3]+0x01;
        }

        //get minute
        TIME_BCD[4]=left;

}
void main(){

        TIME_BCD[0]=0x00;
        TIME_BCD[1]=0x01;
        TIME_BCD[2]=0x01;
        TIME_BCD[3]=0x00;
        TIME_BCD[4]=0x00;
        TIME_BCD[5]=0x00;

    get_bcdtime();
   
    printf("20%02d-%02d-%02d %02d:%02d:00", TIME_BCD[0],TIME_BCD[1],TIME_BCD[2],TIME_BCD[3],TIME_BCD[4]);

}

使用特权

评论回复
地板
mohanwei| | 2009-8-6 14:12 | 只看该作者
直接在linux或VC源码包里提取mktime()和gmtime()这两个函数就行了。

使用特权

评论回复
5
barryyan| | 2009-8-6 17:02 | 只看该作者
楼主,4楼的算法对吗,看过了没?还要考虑闰年,2月,和每个月的天数问题。

使用特权

评论回复
6
mohanwei| | 2009-8-6 17:29 | 只看该作者
这些还不算什么,可能还会有夏令时……

使用特权

评论回复
7
center|  楼主 | 2009-8-6 18:48 | 只看该作者
谢谢楼上的朋友们,我验证了4楼的程序,好像不对(不知是否我的编译环境影响了), 不过还是要感谢 ,

使用特权

评论回复
8
gavin_li| | 2009-8-7 11:51 | 只看该作者
我VC6.0调试没问题。如果年份超过2009年,估计会有问题。因为我的闰年只是hard code 到2008年。
我不清楚楼主的开发环境是什么

使用特权

评论回复
9
nenozyp| | 2009-8-7 12:41 | 只看该作者
最好做一个表格,就是把leap年及非leap年等相关因素做一个有限数据表。比如在处理公历到农历的方法上就可做一个表格,毕竟农历方面“甲子”一个60年的轮回可以穷尽列举出来的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

129

帖子

0

粉丝