プログラミングのお題スレ Part22 (859レス)
上下前次1-新
抽出解除 レス栞
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
693(3): デフォルトの名無しさん [] 2025/03/19(水) 22:39:07.36 ID:P0JLFopv(1/2) AAS
お題:単位分数のエジプト風分解(2進数風味)
1/aを、1/a=1/b+c/dを満たす1/bとc/dに分解する。
aは1以上の整数とする。
c, dは整数とし、bは2の整べき乗(1, 2, 4,...)とする。
c/dは絶対値が最小である事(負数であってもよい)。
例:
1/3→1/4+1/12 : b=4, c=1, d=12
1/7→1/8+1/56 : b=8, c=1, d=56
1/9→1/8-1/72 : b=8, c=-1, d=72(c=1, d=-72も可)
1/13→1/16+3/208 : b=16, c=3, d=288
1/60→1/64+1/960 : b=64, c=1, d=960
694: 693 [] 2025/03/19(水) 22:42:43.02 ID:P0JLFopv(2/2) AAS
aは2以上の整数とする。
に訂正します。
695: デフォルトの名無しさん [] 2025/03/19(水) 23:16:25.83 ID:G4dDQ6P7(1) AAS
>>693
R
外部リンク:ideone.com
aが2の整べき乗の場合の出力形式に指定がなかったので適当に決めた。
696: デフォルトの名無しさん [sage] 2025/03/20(木) 08:21:38.87 ID:6IEA4H0O(1) AAS
>>693 Rust
fn f(a: i64) -> String {
let b = (a as u64).next_power_of_two() as i64;
let b = if 3 * a > 2 * b { b } else { b >> 1 };
let (c, d) = (b - a, a * b);
let shift = c.trailing_zeros().min(d.trailing_zeros());
let (c, d) = (c >> shift, d >> shift);
if a == b {
format!("1/{a}=1/{b}")
} else {
format!("1/{a}=1/{b}{c:+}/{d}")
}
}
fn main() {
assert_eq!("1/3=1/4+1/12", f(3));
assert_eq!("1/7=1/8+1/56", f(7));
assert_eq!("1/9=1/8-1/72", f(9));
assert_eq!("1/13=1/16+3/208", f(13));
assert_eq!("1/60=1/64+1/960", f(60));
assert_eq!("1/64=1/64", f(64));
assert_eq!("1/6718464=1/8388608+1631/55037657088", f(6718464));
assert_eq!("1/123456789=1/134217728+10760939/16570089725755392", f(123456789));
}
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.055s