看到了云风大哥写的算法,感觉很好,贴上来看看:

下面的程序用两种算法实现了判断,并比较了效率的高低

作者:云风

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char valid[1232];

void init_valid_table()
{
        int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        int i,j;
        memset(valid,0,1232);
        for (i=0;i<12;i++) {
                for (j=1;j<=m[i];j++) {
                        valid[(i+1)*100+j]=1;
                }
        }
}

int valid_date1(int d)
{
  int year;
        int day=d%10000;
        if (day>1231)
                return 0;
        if (!valid[day])
                return 0;
        year=d/10000;
        if (year<1900 || year>2100) {
                return 0;
  }
        if (day==1228) {
                if (year%4!=0) {
                        return 0;
                }
                if (!(year%100==0 && year%400!=0)) {
                        return 0;
                }
        }
        return 1;
}

int month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};

int valid_date2(int d)
{
 int year=d/10000;
 int month=(d/100)%100;
 int day=d%100;
 if (year<1900 || year>2100 || month<1 || month>12) {
  return 0;
 }
 if (day<1 || day>month_day[month]) {
  return 0;
 }
 if (month==2 && day==28) {
            if (year%4!=0) {
                    return 0;
            }
            if (!(year%100==0 && year%400!=0)) {
                    return 0;
            }
 }
 return 1;
}

#define RDTSC  _asm _emit 0x0f _asm _emit 0x31

#pragma warning (push)
#pragma warning (disable: 4035)
__inline unsigned __int64 timestamp()
{
 __asm RDTSC
}
#pragma warning (pop)

int create_date()
{
 int year=rand()%200+1900;
 int month=rand()%50;
 int day=rand()%50;
 return year*10000+month*100+day;
}

int main()
{
 int n=10000000;
 int i;
 unsigned __int64 t;
 unsigned __int64 rand_time;

 rand_time=timestamp();
 for (i=0;i<n;i++) {
  int r=create_date();
 }
 rand_time=timestamp()-rand_time;

 printf("%u\n",(unsigned int)rand_time);

 t=timestamp();
 for (i=0;i<n;i++) {
  int r=create_date();
  valid_date1(r);
 }
 t=timestamp()-t-rand_time;

 printf("%u\n",(unsigned int)t);

 t=timestamp();
 init_valid_table();

 for (i=0;i<n;i++) {
  int r=create_date();
  valid_date2(r);
 }
 t=timestamp()-t-rand_time;

 printf("%u\n",(unsigned int)t);
 return 0;
}

评论
发表评论

您还没有登录,请登录后发表评论

tangshuo
搜索本博客
我的相册
存档
最新评论