POJ-2809-2的n次方

题目部分大家可以直接上百练官网去看一下,不再赘余讲述。值得注意的是,自己一开始做这道题的时候所担心的事情还是发生了,哈哈,这让我明白一个道理,程序猿需要对自己那神奇的第六感买单,而且应该尽早买单。

刚开始做得时候,只知道移位运算,然而这道题仅仅耍这种伎俩是远远不够的。我们知道long long 最多也只能容忍你64位,然而题目一开口就要100位,我那不祥的预感马上应验了。

POJ-2809-2的n次方_第1张图片

当我得出上面这个思路的时候已经稍稍接近了答案,但是我却拘泥于其中,其实真正的解题思路就是将两者结合。也就是说,我们需要自己模拟数据运算的过程

然后经过我一番努力,最终还是没有搞出来,经过几番询问才搞到了这个可以通过的代码段,至于作者是谁,还真不知道……不过总算是圆了我一个梦呀~感谢这位机智的少年。

我们解决问题的思路是这样的:

  1. 为数组存储所有位的数字而开辟空间,初始化
  2. 不断用可以改变邻近两位的游标,前后游走,计算和存储数据,从个位向最高位遍历
  3. 从最高位向最低位进行输出,得到结果
#include<iostream> 
#define MAXNUM 2000 
using namespace std;   
int arr[MAXNUM];   
int main()   
{   
    int n,index;   //index表示最高位在数组中的下标
    cin>>n;   

    index=0;   //开始时肯定最高位为个位,2嘛

    for(int i=0;i<MAXNUM;i++)   
    {   
        arr[i]=0;    
    }    

    arr[0]=2;   

    for(int i=1;i<n;i++)   //这里是小于n如果n是1则不执行,这是非常好的。
    {   
        //这是一个不断解决当前位和进一位的问题的代码,就以两位为关注点不断对问题进行解决
        int jinwei=0;   
        for(int j=0;j<=index;j++)   
        {   
            int temp=1;  //temp表示“当前所在的位(个位、十位……)”运算后的结果,并且此结果一定是两位数 由于是乘以2
            if(j==0)   
            {   
                temp=arr[j]*2; //当前的位的数乘以二,比方说8乘以2 
                if(temp>=10)   //得16吧
                {   
                    jinwei=1;   //当然需要进一位
                }   
            }    
            else  
            {   
                temp=arr[j]*2;   
                if(jinwei==1)   //处理上一位遗留下来的进位事务
                {   
                    temp=temp+1;    
                }   
                if(temp>=10)   //如果这一位仍然×2后大于10继续进位
                {   
                    jinwei=1;   
                }   
                else  //否则进行下一轮循环或者跳出进行取余获得当前位的数据
                {   
                    jinwei=0;    
                }   
            }   
            arr[j]=temp%10;   //当前位取余,不管进位如何
        }  

        if(jinwei==1)   //如果进位为1,那么需要开拓新的空间来承载这个更大的数
        {   
            index++;   
            arr[index]=1;   
        }   
    }

    for(int i=index;i>=0;i--)   //输出肯定是从高位到低位
    {   
        cout<<arr[i];    
    }   
    cout<<endl;   

    system("pause");    
    return 0;   
}  

恒宝的感想:
这段代码不仅易读而且管用,真是好作品。品味这段代码才让我明白:我们处理一个算法题目必须抓住最关键的点比方说2的n次方,重点是不断地乘以2,而对于乘以2来说又可以锁定为两位数的进位运算。算法真是妙不可言。

你可能感兴趣的:(2的n次方)