八进制小数——Roj_1005

难点:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值