結果
| 問題 |
No.894 二種類のバス
|
| コンテスト | |
| ユーザー |
GinFizz1185
|
| 提出日時 | 2019-11-19 20:42:55 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,134 bytes |
| コンパイル時間 | 1,291 ms |
| コンパイル使用メモリ | 30,336 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-10-04 07:07:46 |
| 合計ジャッジ時間 | 2,376 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 RE * 1 |
| other | WA * 6 RE * 11 |
ソースコード
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#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;
}
GinFizz1185