zoukankan      html  css  js  c++  java
  • NOIP幂次方

    #include<stdio.h>
    int c[20] = { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768 };//由题意n最大为20000,所以最多会用到2的14次方
    //为了防止mid+1出错,故写到15次方
    
    int binarySearch(int x, int mid) {
        if (x >= c[mid] && x < c[mid + 1]) {
            return mid;
        }
        if (x >= c[mid + 1])
            return 20;
        return -1;
    }
    
    int serch(int x) {//利用二分查找找到x的最大二次方
        int left = 0;
        int right = 15;
        int mid;
        while (left <= right) {
            mid = (left + right) >> 1;
            if (binarySearch(x, mid) == -1) {
                right = mid - 1;
            }
            else if (binarySearch(x, mid) == 20) {
                left = mid + 1;
            }
            else {
                return mid;
            }
        }
    }
    void divite(int x) {//分治求解:因为每个整数的划分方法是一样的
        if (x == 0)
            return;
        int flag = serch(x);
        int li = x - c[flag];
        if (flag == 0) {
            printf("2(0)");
        }
        if (flag == 1) {
            printf("2");
        }
        if (flag > 1) {
            printf("2(");
            divite(flag);
            printf(")");
        }
        if (li > 0) {
            printf("+");
            divite(li);
        }
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        divite(n);
        return 0;
    }
  • 相关阅读:
    Redis学习小结
    抽屉模型
    用户提交数据的验证
    jsonp原理与实验
    文件上传
    项目
    CBV
    C++算法 线段树
    写一些奇怪的东西找到的奇怪的错误
    php安装过程出现的一些错误问题:
  • 原文地址:https://www.cnblogs.com/lin0/p/8550722.html
Copyright © 2011-2022 走看看