Stay Hungry,Stay Foolish!

C - 343

C - 343

https://atcoder.jp/contests/abc343/tasks/abc343_c

 

思路

先找出最大三次方数,次数小于或者等于 n,

参考:

在三次方根的可能范围内,使用二分查找法,定位最大的三次方根

https://www.cnblogs.com/Ghost-Knight/p/17970849

 

从此最大的三次方根开始,向下枚举, 枚举过程中对 三次方数进行是否回文的判定,

如果是回文,则停止。

 

Code

https://atcoder.jp/contests/abc343/submissions/50830008

ll n;
ll low = 0;
ll high = 1000000;

int main()
{
    cin >> n;
    
    ll left = 0;
    ll right = high;

    while(left < right-1){
//        cout << "left="<<left << " right="<<right<<endl;
        
        ll middle = (left + right) / 2;
        
        ll cubic = middle*middle*middle;
        if (cubic == n){
            left = middle;
            break;
        } else if (cubic < n){
            left = middle;
        } else {
            right = middle;
        }
    }
    
//    cout << "left = " << left << endl;
    
    for (ll i=left; i>=0; i--){
        ll cubic = i*i*i;
        ll cubic_origin = cubic;
        
        vector<int> digits;
          while(cubic){
            int r = cubic%10;
            digits.push_back(r);
            
            cubic = cubic / 10;
        }
        
//        cout << "digits ====" << endl;
//        for(auto one: digits){
//            cout << one << " ";
//        }
//        cout << endl;
        
        bool ishuiwen = true;
        int left = 0;
        int right = digits.size() - 1;
        while(left < right){
//            cout << "digits[left]="<<digits[left]<< endl;
//            cout << "digits[right]="<<digits[right]<< endl;
            
            if (digits[left] != digits[right]){
                ishuiwen = false;
                break;
            }
            
            left++;
            right--;
        }
        
//        cout << "ishuiwen=" << ishuiwen << endl;
        if (ishuiwen){
            cout << cubic_origin << endl;
            break;
        }
    }

    return 0;
}

 

posted @ 2024-03-02 23:40  lightsong  阅读(11)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel