一道c++的算法题目

昨天看到一个求时间的帖子:

在C++中,已知从1900年1月1日到某天经过了7865284526秒,请帮我想一想怎样根据这个秒数把具体的日期时间求出(比如:2007年3月5日   10:20:32) 

刚把它做出来,准备回复那个人的,结果没想到他结贴了。下面我把我的算法贴出来!

#include <iostream>
using namespace std;
int months = 0;
int leftdays = 0;
int a[] = {334,304,273,243,212,181,151,120,90,59,31,0};
__int64 seconds = 7865284526;
int daysToMonth(int sumDays)
{
 bool flags = true;
 int i = 0;
 while (flags)
 {
  if (sumDays > a[i])
  {
   months = 12 - i;
   leftdays = sumDays - a[i];
   flags = false;
  }
  else
   ++i;
 }
 return months;
}


int main()
{
 long second = 4*365*24*60*60 + 24*60*60;
 int year = seconds/second;
 int years = year*4;
 int left = seconds%second;
 int ssecond = 365*24*60*60;//每年的秒数
 int lyear = left/ssecond;//剩余秒数对应的年数
 int leftsec = left%ssecond;//换成年之后剩余的总秒数
 int leftseconds = leftsec%60;//换算成分钟后剩余的秒数
 int minutes = leftsec/60;//总分钟数
 int leftminites = minutes%60;//剩余的分钟数
 int hours = minutes/60;//总小时数
 int lefthours = hours%24;//换成天剩余的小时数
 int days = hours/24;//总天数
 years += lyear;


int count = 0;//计算出将不是闰年的也当做闰年的年数
 for (int x = 1900; x <= 1900+years; x++)
 {
  if((x%100 == 0)&&(x%400 != 0))
   count++;
 }


 daysToMonth(days);

 cout<<"所以,从1900年开始经过"<<seconds<<"秒后的时间为:"<<endl;
 cout<<(years+1900)<<("年")<<months<<("月")<<leftdays<<("日")<<lefthours
  <<("时")<<leftminites<<("分")<<leftseconds<<("秒")<<endl;
 return 0;
}
本人的思路是这样的:先粗略的假设凡是能被4整除的年份就是闰年,则每4年中必有一年是闰年:if((years+1900)%4 == 0)是闰年的判断式。因此,我先求出4年的总时间second = 126230400(单位:秒),那么总时间(seconds/second)*4就是年数years,则剩下的即left = seconds%second中所包含年数最大为3,且其中一定不包含闰年,因为按照前面的第一条假设,1900年是"闰年".接下来的问题就是根据剩下的left秒求出有多少年(lyear)多少月多少日多少小时多少分多少秒。先求出年数lyear,得到真正的总年数years += lyear;再求出不构成分钟的剩下的秒数,再求出不构成小时的分钟数,再求出不构成一天的小时数,最后剩下天数,这里求出的天数也不是准确的,因为我的大假设是有点问题的,闰年的真正判别式为:

if(year%4==0   &&   year%100!=0   ||   year%400==0) 显然我的假设只可能让求出的天数变少,所以要把不是闰年当作闰年的年份求出来,每求出一年相应的天数就要加1。这样得出的天数days才是正确的。  由天数转化为月数我专门写了一个函数daysToMonth(int sumDays);

输出结果为:

所以,从1900年开始经过7865284526秒后的时间为:
2149年3月29日9时15分26秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值