#UVa:10070-Leap Year or Not Leap Year and …

灆洢 2016-04-15 15:09:13

主要是輸入的年代得用大數存放,所以必須了解如何去判斷大數是否為某個數字的倍數。

  • 4的倍數:由於\(4 \times 25 = 100\),故百位數字以上基本上一定可被4整除,所以僅看後兩位數字是否為4的倍數即可。
  • 100的倍數:與4的倍數相同道理,僅看後兩位數字是否為100的倍數即可。
  • 400的倍數:由於\(400 \times 25 = 100\),故萬位數字以上基本上一定可被400整除,所以僅看後四位數字是否為400的倍數即可。
  • 15的倍數:看是否為3與5的倍數即可。
  • 3的倍數:將每一位數字做總和後,看總和是否為3的倍數即可。
  • 5的倍數:看個位數字是否為5或0即可。
  • 55的倍數:看是否為5與11的倍數即可。
  • 11的倍數:看數字中奇數位數字總和與偶數位數字總和之差是否為11的倍數即可。

C++(0.000)

/*******************************************************/
/* UVa 10070 Leap Year or Not Leap Year and ...        */
/* Author: Maplewing [at] knightzone.studio            */
/* Version: 2016/04/15                                 */
/*******************************************************/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;

bool is3mul(const string &number){
  int sum = 0;
  for( int i = 0 ; i < number.length() ; ++i ){
    sum += number[i] - '0';
  }

  return sum % 3 == 0;
}

bool is5mul(const string &number){
  return (number[number.length()-1] - '0') % 5 == 0;
}

bool is11mul(const string &number){
  int sum[2] = {0};
  for( int i = 0 ; i < number.length() ; ++i ){
    sum[i%2] += number[i] - '0';
  }

  return (int)abs( sum[0] - sum[1] ) % 11 == 0;
}

int main(){
  string year;
  bool space = false;
  while( cin >> year ){

    if( space ) {
      printf("\n");
    }
    space = true;

    bool isLeap = false;
    bool hasPrinted = false;
    int lastFourDigit;
    sscanf( year.c_str()+year.length()-4, "%d", &lastFourDigit );
    if( (lastFourDigit % 400 == 0) ||
        (lastFourDigit % 100 != 0 && lastFourDigit % 4 == 0) ){
      printf("This is leap year.\n");
      isLeap = true;
      hasPrinted = true;
    }

    if( is3mul(year) && is5mul(year) ){
      printf("This is huluculu festival year.\n");
      hasPrinted = true;
    }

    if( isLeap && is5mul(year) && is11mul(year) ){
      printf("This is bulukulu festival year.\n");
      hasPrinted = true;
    }

    if( !hasPrinted ){
      printf("This is an ordinary year.\n");
    }
  }


  return 0;
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料