2진수

use std::io;
fn main(){
    let mut select=String::new();
    let _ = io::stdin().read_line(&mut select);
    let value=11;
    let base_n:u128=0b100101011;
    if select=="1\n"{
        println!("num_besmall");
        num_besmall_counts(base_n);
    }
    else{
        println!("Ncount");
        n_count_not_find(value, base_n);
    }
}
fn num_besmall_counts(base_n:u128){
    let mut value;
    let length=128-base_n.leading_zeros();
    let mut appear_count=[0;400];
    let mut caled_num:u128;
    for i in 1..100{
        caled_num=base_n+(i<<length);
        value=count(caled_num);
        appear_count[value]+=1;
    }
    for i in 0..400{
        if appear_count[i]!=0{
            println!("{} is appear {} count.",i,appear_count[i]);
        }
    }
}

fn n_count_not_find(value:usize,base_n:u128){
    let mut caled_num:u128;
    let length=128-base_n.leading_zeros();
    let mut flag:bool=true;
    for i in 1..100{
        caled_num=base_n+(i<<length);
        if count(caled_num) ==value{
            println!("{:16b}is{}",caled_num,value);
            flag=false;
        }
    }
    if flag{
        println!("all pass");
    }
    
}
fn count(mut n:u128)->usize{
    let first:u128=n;
    let mut count:usize=0;
    while n>=first{
        count=count+1;
        if n%2==0{
            n=n>>1;
        }
        else{
            n=(n<<1)+n+1;
        }
    }
    count
}

2진수로 바꿔봤다.

//const MAX:u128=340282366920938463463374607431768211455;
fn main(){
    let goal_num=100_000_000_000;
    let mut number:u128=1;
    while number<goal_num{
        number+=2;
        let mut one=0;
        let mut zero=0;
        let mut big_zero=0;
        let mut big_one=0;
        let mut iszero=false;
        let length=128-number.leading_zeros();
        for j in 0..length{
            if number&1<<j==0{
                zero+=1;
                one=0;
                if iszero{
                    zero+=1;
                    if zero>big_zero{
                        big_zero=zero;
                    }
                }
                iszero=true;
            }
            else{
                if !iszero{
                    one+=1;
                    zero=0;
                    if one>big_one{
                        big_one=one;
                    }
                }
                iszero=false;
            }
        } 
        //println!("number{:b} zero{} one{}",number,big_zero,big_one);
        if big_zero>big_one{
            continue;
        }
        count(number);
    }
    println!("{}",goal_num);
}
fn count(mut n:u128)->bool{
    let first:u128=n;
    let mut count:usize=0;
    while n>=first{
        count=count+1;
        if n%2==0{
            n=n>>1;
        }
        else{
            n=(n<<1)+n+1;
        }
    }
    true
}

0이 연속으로 많이 나오면 일정하게 계산량이 유지되는 규칙을 이용했다. 대략적으로 그런 규칙인거고 확실한 규칙은 아니다.

Last updated

Was this helpful?