#include #include #include #define STR_LENGTH 23 void str_cut(char*, unsigned long long*); unsigned long long calGCD(unsigned long long arg1, unsigned long long arg2); unsigned long long calDep(unsigned long long dayLong, unsigned long long interval); int main(void) { char str[STR_LENGTH]; unsigned long long input[3] = {0}; unsigned long long gcd = 0; unsigned long long lcm = 0; unsigned long long depNumA = 0; unsigned long long depNumB = 0; unsigned long long depNumAB = 0; fgets(str, sizeof(str), stdin); str_cut(str, input); gcd = calGCD(input[1], input[2]); // printf("GCD = %d\n", gcd); lcm = input[1] * input[2] / gcd; depNumA = calDep(input[0], input[1]); depNumB = calDep(input[0], input[2]); depNumAB = calDep(input[0], lcm); // printf("depA = %d\n depB = %d\n depAB = %d\n", depNumA, depNumB, depNumAB); printf("%d\n", 1 + depNumA + depNumB - depNumAB); return 0; } /* 関数概要:渡された文字列を空白で分離し、数値に変換する 第1引数:文字列 第2引数:文字列から数値に変換して格納する配列 */ void str_cut(char* str, unsigned long long* arg2) { int start_str = 0; int num = 0; //配列NO int i = 0; while('\0' != str[i]){ if(' ' == str[i]){ str[i] = '\0'; arg2[num] = (unsigned long long) strtoull(&str[start_str], NULL, 10); ++num; ++i; start_str = i; } ++i; } arg2[num] = (unsigned long long) strtoull(&str[start_str], NULL, 10); return; } /* 関数概要:ユークリッドの互除法により最大公約数を求める 第1引数[unsigned long long]:最大公約数を求めたい値1 第2引数[unsigned long long]:最大公約数を求めたい値2 戻り値:[unsigned long long]:第1引数と第2引数の最大公約数 備考:第1引数と第2引数の大小は問わない */ unsigned long long calGCD(unsigned long long arg1, unsigned long long arg2) { unsigned long long largerNum = 0; unsigned long long smallerNum = 0; unsigned long long remainder = 0; // 大小比較 if(arg1 >= arg2) { largerNum = arg1; smallerNum = arg2; } else { largerNum = arg2; smallerNum = arg1; } if(smallerNum != 0){ while(1){ remainder = largerNum % smallerNum; // printf("remainder = %d\n", remainder); if(0 != remainder) { largerNum = smallerNum; smallerNum = remainder; } else { break; } } } return smallerNum; } /* 関数概要:一日の長さと出発の間隔より、一日の出発回数を求める 第1引数[unsigned long long]:一日の長さ 第2引数[unsigned long long]:出発間隔 戻り値:[unsigned long long]:出発回数 備考:一日のちょうど終わりに出発したものはカウントしない */ unsigned long long calDep(unsigned long long dayLong, unsigned long long interval) { unsigned long long depNum = 0; if(0 != interval) { depNum = dayLong / interval; if(0 == (dayLong % interval)) { depNum -= 1; } } return depNum; }