#include <stdio.h>
//指数运算
_int64 _pow(int base,int p)
{
int i=0;
_int64 ret=1;
if (p==0) return 1;
for(i=1;i<=p;i++)
{
ret=ret*base;
}
return ret;
}
//把一个大的_int64拆分成2个小的_int64
void long2short(_int64 source,_int64* high,_int64* lower)
{
*lower=source % 1000000000;
*high=source/1000000000;
}
//判断一个_int64的长度
int longintlen(_int64 source)
{
int tmp=0;
while(source>0)
{
source/=10;
tmp++;
}
return tmp;
}
//把2个_int64合成一个大的_int64
//目标返回值需要调用者分配内存并初始化'\0'
void longint2char(_int64 high,_int64 lower,char dest[])
{
int hlen=longintlen(high);
int wlen=longintlen(lower);
while(lower>0)
{
dest[hlen+wlen-1]=lower%10+0x30;
lower/=10;
wlen--;
}
while(high>0)
{
dest[hlen-1]=high%10+0x30;
high/=10;
hlen--;
}
}
int main()
{
int k;
_int64 sum=0,tmp=0;
char dest[20]={'\0'};
for(k=0;k<63;k++)
{
tmp=_pow(2,k);
sum+=tmp;
}
_int64 _h,_l;
long2short(sum,&_h,&_l); //将超大数拆分成2个小大数
_int64 _l2=_l*2+1; //对低端小大数进行计算
int flag=_l2/1000000000; //保存进位
_l2=_l2 % 1000000000; //去除进位
_int64 _h2=_h*2+flag; //对高端小大数进行计算
longint2char(_h2,_l2,dest);//将小大数再次合成超大数
printf("%s\n",&dest[0]);
return 0;
}