高中生程式解題系統:TOI2008 2. 大數運算

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

題目在此
此題筆者用Java寫,因為Java有好用的 API BigInteger 阿。
用 Python 時,可以用eval函數。
基本上此題是用陣列來處理,此部分可參考 超長整數運算(大數運算)一文。
程式碼:

高中生程式解題系統:日期差幾天

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

題目連結 http://zerojudge.tw/ShowProblem?problemid=a263

這題需要注意閏年的判斷。筆者用一個陣列daysPerMon[13]來紀錄每個月有幾天。

要算出西元 0 年 1 月 1 日 到 西元 y 年 m 月 d 日總過經過多少天數。
算法是先算出從西元 0 年到今年 y 經過多少天,再算出到這個月 m 經過多少天,加上今天的 d 。
於是可以得到 daysCnt(y1, m1, d1)與 daysCnt(y2, m2, d2) ,再將這兩個值相減會是要的答案。

程式碼:
#include <cstdio>
#include <iostream>

using namespace std;

int daysPerMon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool isLeapYear(int year)
{
 return (year % 4 == 0 && year % 100 || year % 400 == 0);
}

int daysCnt(int year, int month, int day)
{
 int sumOfDays = 0;
 for(int i = 1; i < year; i++)
 {
  bool isLeap = isLeapYear(i);

  if(isLeap)
  {
   sumOfDays += 366;
  }
  else
  {
   sumOfDays += 365;
  }
 }
 
 for(int i = 1; i < month; i++)
 {
  sumOfDays += daysPerMon[i];
 }
 
 if(isLeapYear(year) && month > 2)
  sumOfDays++;

 sumOfDays += day;
 
 //cout << "Total Days:" << sumOfDays << endl;
 return sumOfDays;
}

int dateDif(int y1, int m1, int d1, int y2, int m2, int d2)
{
 return daysCnt(y1, m1, d1) - daysCnt(y2, m2, d2);
}

int main() {
 int year[2], month[2], day[2]; 
 
    while(scanf("%d%d%d %d%d%d", &year[0], &month[0], &day[0], &year[1], &month[1], &day[1]) != EOF)
 {
  int result = dateDif(year[0], month[0], day[0], year[1], month[1], day[1]);
  if( result < 0)
   result = - result;
  cout << result << endl;
 }
    return 0;