zoukankan      html  css  js  c++  java
  • 结题报告

    题目:点此

    题意描述:

    任何一个正整数都可以用2的幂次方表示。例如:

        137=27+23+20

    同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:

        2(7)+2(3)+2(0)

    进一步:7=22+2+20(21用2表示)

            3=2+20

    所以最后137可表示为:

        2(2(2)+2+2(0))+2(2+2(0))+2(0)

    又如:

        1315=210+28+25+2+1

    所以1315最后可表示为:

        2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    思路:

    使用递归,如果要输出的是2,直接输出2;如果是1,输出2(0)。

    计算log2n(我的up_pow函数),并存储。

    先输出一个2,如果i也就是㏒2n不是一,输出左括号“(”,递归调用i,再输出右括号“)”。

    如果还有剩余(n-2i!=0)输出+,递归调用,然后结束函数。

    再main函数中,只需读入n,然后调用函数即可。

    犯的错误:

    1. 快速幂没加返回值。
    2. 有很多地方应是i不是i-1。
    3. 快速幂函数没加边界条件。

    收获:

    1. 要仔细,不要漏东西。

    代码:

    #include <iostream>
    using namespace std;
    int quick_pow(int index,int r){
    	if(r==0){
    		return 1;
    	}
    	if(r==1){
    		return index;
    	}
    	int data=1;
    	if(r%2!=0){
    		data=index;
    	}
    	int type=quick_pow(index,r/2);
    	data*=type*type;
    	return data;
    }
    int up_pow(int max){
    	int index=1,number=0;
    	while(index<max){
    		number++;
    		index<<=1;
    	}
    	if(index>max){
    		number--;
    	}
    	return number;
    }
    int f(int n){
    	if(n==1){
    		cout << "2(0)";
    		return 0;
    	}
    	if(n==2){
    		cout << "2";
    		return 0;
    	}
    	int i=up_pow(n);
    	cout << "2";
    	if(i!=1){
    		cout << "(";
    		f(i);
    		cout << ")";
    	}
    	n-=quick_pow(2,i);
    	if(n!=0){
    		cout << "+";
    		f(n);
    	}
    	return 0;
    }
    int main(){
    	int n;
    	cin >> n;
    	f(n);
    	return 0;
    }
    

      

  • 相关阅读:
    二分练习题4 查找最接近的元素 题解
    二分练习题5 二分法求函数的零点 题解
    二分练习题3 查找小于x的最大元素 题解
    二分练习题2 查找大于等于x的最小元素 题解
    二分练习题1 查找元素 题解
    code forces 1176 D. Recover it!
    code forces 1173 B. Nauuo and Chess
    code forces 1173 C. Nauuo and Cards
    吴恩达深度学习课程笔记-15
    吴恩达深度学习课程笔记-14
  • 原文地址:https://www.cnblogs.com/eason66-blog/p/P8758.html
Copyright © 2011-2022 走看看