POJ——2506(找规律加大数乘法 )

来源:互联网 发布:js webkittransition 编辑:程序博客网 时间:2024/05/21 23:44

题目链接:http://poj.org/problem?id=2506


源代码:


#include<iostream>
using namespace std;
int main()
{
int i,j;
long long a[64];            //存储前63个
int b[200][255];            //存储后187个
int len[200]; 

               //存储后187个的长度
a[0]=1;          //当n=0的时候,结果为1奥
a[1]=1;
a[2]=3;


  for(i=3;i<64;i++)


  if(i%2==0) a[i]=a[i-1]*2+1; //当偶数时,结果为前面的二倍加一

  else a[i]=a[i-1]*2-1;           //当奇数时,为二倍减一
 
     memset(b,0,sizeof(b));
     long long mid=a[63];         //把n=63的时候,赋值给b【0】
     int q=0;


     while(mid>0)
     {


      b[0][q++]=mid%10;
      mid/=10; 


     }
     len[0]=q;


    int mid1;
    int p;


    for(i=1;i<200;i++)
     {


      if(i%2==1) mid1=b[i-1][0]*2+1;   //处理最低位
      else      mid1=b[i-1][0]*2-1;   
      
      if(mid1>=10)
      {
         b[i][0]+=mid1%10;
         b[i][1]+=mid1/10;
      }
      else b[i][0]=mid1;


        q=1;
        p=1;


      while(q<len[i-1])
      {
      mid1=b[i-1][q]*2;

      if(mid1>=10)
    {
    b[i][p]+=mid1%10;
  b[i][p+1]+=mid1/10;
  if(q==len[i-1]-1)   p++;
  }
  else b[i][p]+=mid1;
 
     q++;
     p++;
      }//end   while
     
        len[i]=p;
     } //end for
     /*for(i=0;i<40;i++)
      {
  for(j=len[i]-1;j>=0;j--)
         cout<<b[i][j];
       cout<<endl;
      }*/


      int n;


      while(cin>>n)
      {
      if(n<64)
      cout<<a[n]<<endl;
      else 
       {
       for(j=len[n-63]-1;j>=0;j--) 
    cout<<b[n-63][j];
          cout<<endl;
       }
      }
     
}

原创粉丝点击