难点:
1.这题最主要的问题就是big num,long long 无法存下这么大的数,因此要考虑将这个数放在一个数组里,将整数的运算转换成数组各个位置上的运算。
2.其次就是考虑将其放在结构体中,用operator重新定义各种运算后。
3.重定义等于号时需要先定义,然后再进行“赋值”。
4.输出时要注意啊a[i]是char在输出时-‘0’可能会出问题。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
char s[1111];
//int a[1111];
struct Bignum
{
char a[1111];//1234
int d;//number of digits
void operator=(const int &l)
{
memset(a,0,sizeof(a));//clear
if (l==0) d=1;
else if (l==1) {d=1;a[0]=1;}
else puts("!!!!!ERROR");//make a mark
}
void operator+=(const Bignum &l)
{
d=max(d,l.d);
for (int i=d-1;i>0;i--)
{
a[i]+=l.a[i];
if (a[i]>=10) {a[i-1]++;a[i]-=10;}
}
}
void operator/=(const int &l)
{
if (l!=8) {puts("ERROR????");return;}//make a mark
for (int i=0;i<d;i++)
{
a[i+1]+=(a[i]%l)*10;
a[i]/=l;//cout<<"a["<<i<<"]="<<(int)a[i]<<endl; cover
}
for (;a[d];d++)
{
a[d+1]+=(a[d]%l)*10;
a[d]/=l;
//cout<<"a["<<d<<"]="<<(int)a[d]<<endl;
}
}
Bignum operator*(const int &l)
{
Bignum res;
res=0;
res.d=d;
for (int i=d-1;i>0;i--)
{
res.a[i]+=a[i]*l;
if (res.a[i]>=10) {res.a[i-1]+=res.a[i]/10;res.a[i]%=10;}
}
return res;
}
void print()
{
if (d==1) {cout<<"1"<<endl;return;}
cout<<"0.";
int d1;d1=d;
for(int i=d-1;i>=1;i--)
{
if(a[i]==0) d1--;
else break;
}
for (int i=1;i<d1;i++) cout<<(int)a[i];
cout<<endl;
}
};
void calcu(char s[])
{
int l=strlen(s);
Bignum ans,p;
ans=0,p=1;
for (int i=0;i<l;i++)
{
p/=8;
//cout<<"P:";
//p.print();
ans+=p*(s[i]-'0');
}
ans.print();
//for(int i=1;i<1111;i++) a[i]=0;
//for(int i=2;i<l;i++)
//{//cout<<"l="<<l<<endl;
// for(int k=1;k<i-1;k++) change(i,s[i]);
//}
//cout<<"0.";
//for(int i=1;a[i]!=0;i++) cout<<a[i];
//cout<<endl;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
cin>>s;
cout<<"case #"<<i<<":"<<endl;
calcu(s+2);
}
return 0;
}