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;
    }
    

      

  • 相关阅读:
    有关try..catch..finally处理异常的总结
    java中finally和return的执行顺序
    慢查询处理
    阿里云数据库配置文件
    在DEV c++ 中如何设置默认的代码模板
    「C语言」单链表/双向链表的建立/遍历/插入/删除
    使用VS.NET2019做为C++开发专用IDE
    Windows下通过SSH无密码连接Linux服务器
    海沧区磁盘扩容思路办法
    Rabbitmq异常排查
  • 原文地址:https://www.cnblogs.com/eason66-blog/p/P8758.html
Copyright © 2011-2022 走看看