알 리 바 바 알고리즘 강 프로 그래 밍 문제: 초보 창고

3855 단어
채소 창고
채소 새 창 고 는 매우 크 고 신기 한 곳 이다. 각종 아름 다운 상품 들 이 진열 대 위 에 가지런히 놓 여 있다. 보통 한 종류의 상품 은 선반 의 한 칸 에 놓 여 있 고 칸 은 통 일 된 번호 가 있어 서 노동자 들 이 선택 하기에 편리 하 다.어느 날 목 철 은 채소 창 고 를 둘 러 보 았 는데 본의 아니 게 첫 번 째 선반 칸 번 호 는 1, 2 - 3 개 는 1, 2, 4 - 6 개 칸 은 각각 1, 2, 3, 7 - 10 개 칸 번 호 는 각각 1, 2, 3, 4 이 고 각 칸 번 호 는 0 - 9 의 정수 이다.또한 인접 한 칸 의 번 호 를 연결 하면 다음 과 같은 규칙 이 있 습 니 다.목 철 은 궁금 했다. 그 는 K 번 째 칸 번호 가 얼마 인지 빨리 알 고 싶 어 했다.
부호 블록
#include  
#include
#include  
using namespace std;
int main()
{
    long long k;
    while (cin >> k)
    {
        long long row = floor((-1.0 + sqrt(1.0 + 8.0 * k)) / 2.0);
        long long col;
        if (k - (1 + row)*row / 2>0)
        {
            col = k - (1 + row)*row / 2;
        }
        else
        {
            col = row;
        }
        long long sum = 0; 
        int q = 10;
        long long n = 0;
        while(sum < col)
        {
            n++;
            sum = ( n * 9 * powl(q, n) - 9 - (9 * 10 * (1 - powl(q, n - 1)) / (1 - q)) ) / (q - 1);
        }
        long long n_last = n - 1;
        long long sum_last = (n_last * 9 * powl(q, n_last) - 9 - (9 * 10 * (1 - powl(q, n_last - 1)) / (1 - q))) / (q - 1);
        long long d_col = col - sum_last - 1;//d_col        
        long long digit = powl(10 , n - 1) + floorl(d_col / n);
        string str = to_string(digit);
        cout << str[d_col % n] << endl;
    }
    return 0;
}

좋은 웹페이지 즐겨찾기