![]() |
#2
Pirelo2013-04-02 09:15
|

#include <iostream>
#include <stdlib.h>
//#include "transition.h"
//using namespace std;
//#include <iostream>
#include <cmath>
using namespace std;
class transition
{
private:
double oldNum;//待转换的数
double newNum;//转换后的数
int newBase;//带转换的数的进制
int oldBase;//转换成的进制数
public:
transition(double a,int b,int c);
//~transition();
int calculate(transition &a);//判断是几进制转换成几进制,在调用相应的函数
void ten_other(transition &a);//十进制转换为其他进制
void other_ten(transition &a);//其他进制转换为十进制
void output(transition &a);//输出
};
transition::transition(double a,int b,int c)
{
oldNum=a;
newBase=b;
oldBase=c;
newNum=0;
}
int transition::calculate(transition &a)
{
if(a.oldBase<0&&a.newBase<0)
{
cout<<"进制位错误"<<endl;
exit(0);
}
else if(a.oldBase!=10)
{
if(a.newBase!=10)
return 0;//其他进制转换其它进制
return 2;//其他进制转换为10进制
}
else
{
return 1;//十进制转换为其他进制
}
}
void transition::ten_other( transition &a)
{
if(a.newNum==0)//直接由十进制转换为其他进制
{
int i;//i为整数位的原数
double k;//k为非整数位的
i=(int)a.oldNum;
k=a.oldNum-i;
int l=1;
while (k)
{
k*=a.newBase;
a.newNum+=(int)k/pow(10.0,l);
k=k-(int)k;
l++;
}
l=0;
while(i)
{
a.newNum+=(i%a.newBase)*pow(10.0,l);
i/=a.newBase;
l++;
}
}
else //由其他进制转换为其他进制,先通过ten_other函数转换为十进制,再通过这转换
{
double c;
c=a.newNum;
a.newNum=0;
int i;//i为整数位的原数
double k;//k为非整数位的
i=(int)c;
k=c-i;
int l=1;
while (k)
{
k*=a.newBase;
a.newNum+=(int)k/pow(10.0,l);
k=k-(int)k;
cout<<'1'<<endl;
l++;
}
l=0;
while(i)
{
a.newNum+=(i%a.newBase)*pow(10.0,l);
i/=a.newBase;
l++;
}
}
}
void transition::other_ten(transition &a)
{
double c;
c=a.oldNum;
a.newNum=0;
int i;//i为整数位的原数
double k;//k为非整数位的
i=(int)c;
k=c-i;
int l=1;
while(k)
{
k=k*10;
a.newNum+=(int)k/pow((double)a.oldBase,l);
k=k-(int)k;
l++;
}
l=0;
while(i)
{
a.newNum+=i%10*pow((double)a.oldBase,l);
i/=10;
l++;
}
}
void transition::output(transition &a)
{
cout<<a.oldBase<<"进制数"<<a.oldNum<<"转换为"<<a.newBase<<"进制数后为"<<a.newNum<<endl;
}
void fun(transition &a)
{
int i;
i=a.calculate(a);
if(i==0)//其他进制位转换为其他进制位
{
a.other_ten(a);
a.ten_other(a);
a.output(a);
}
else if(i==1)//十进制转换为其他进制
{
a.ten_other(a);
a.output(a);
}
else if(i==2)
{
a.other_ten(a);
a.output(a);
}
}
int main()
{
double oldNum;
int newBase;
int oldBase;
cout<<"请输入待转换的数的进制数"<<endl;
cin>>oldBase;
cout<<"请输入待转换的数"<<endl;
cin>>oldNum;
cout<<"请输入转换后的数的进制数"<<endl;
cin>>newBase;
transition a(oldNum,newBase,oldBase);
fun(a);
cin.get();
return 0;
}
我用这种算法的时候,假如输入的是#include <stdlib.h>
//#include "transition.h"
//using namespace std;
//#include <iostream>
#include <cmath>
using namespace std;
class transition
{
private:
double oldNum;//待转换的数
double newNum;//转换后的数
int newBase;//带转换的数的进制
int oldBase;//转换成的进制数
public:
transition(double a,int b,int c);
//~transition();
int calculate(transition &a);//判断是几进制转换成几进制,在调用相应的函数
void ten_other(transition &a);//十进制转换为其他进制
void other_ten(transition &a);//其他进制转换为十进制
void output(transition &a);//输出
};
transition::transition(double a,int b,int c)
{
oldNum=a;
newBase=b;
oldBase=c;
newNum=0;
}
int transition::calculate(transition &a)
{
if(a.oldBase<0&&a.newBase<0)
{
cout<<"进制位错误"<<endl;
exit(0);
}
else if(a.oldBase!=10)
{
if(a.newBase!=10)
return 0;//其他进制转换其它进制
return 2;//其他进制转换为10进制
}
else
{
return 1;//十进制转换为其他进制
}
}
void transition::ten_other( transition &a)
{
if(a.newNum==0)//直接由十进制转换为其他进制
{
int i;//i为整数位的原数
double k;//k为非整数位的
i=(int)a.oldNum;
k=a.oldNum-i;
int l=1;
while (k)
{
k*=a.newBase;
a.newNum+=(int)k/pow(10.0,l);
k=k-(int)k;
l++;
}
l=0;
while(i)
{
a.newNum+=(i%a.newBase)*pow(10.0,l);
i/=a.newBase;
l++;
}
}
else //由其他进制转换为其他进制,先通过ten_other函数转换为十进制,再通过这转换
{
double c;
c=a.newNum;
a.newNum=0;
int i;//i为整数位的原数
double k;//k为非整数位的
i=(int)c;
k=c-i;
int l=1;
while (k)
{
k*=a.newBase;
a.newNum+=(int)k/pow(10.0,l);
k=k-(int)k;
cout<<'1'<<endl;
l++;
}
l=0;
while(i)
{
a.newNum+=(i%a.newBase)*pow(10.0,l);
i/=a.newBase;
l++;
}
}
}
void transition::other_ten(transition &a)
{
double c;
c=a.oldNum;
a.newNum=0;
int i;//i为整数位的原数
double k;//k为非整数位的
i=(int)c;
k=c-i;
int l=1;
while(k)
{
k=k*10;
a.newNum+=(int)k/pow((double)a.oldBase,l);
k=k-(int)k;
l++;
}
l=0;
while(i)
{
a.newNum+=i%10*pow((double)a.oldBase,l);
i/=10;
l++;
}
}
void transition::output(transition &a)
{
cout<<a.oldBase<<"进制数"<<a.oldNum<<"转换为"<<a.newBase<<"进制数后为"<<a.newNum<<endl;
}
void fun(transition &a)
{
int i;
i=a.calculate(a);
if(i==0)//其他进制位转换为其他进制位
{
a.other_ten(a);
a.ten_other(a);
a.output(a);
}
else if(i==1)//十进制转换为其他进制
{
a.ten_other(a);
a.output(a);
}
else if(i==2)
{
a.other_ten(a);
a.output(a);
}
}
int main()
{
double oldNum;
int newBase;
int oldBase;
cout<<"请输入待转换的数的进制数"<<endl;
cin>>oldBase;
cout<<"请输入待转换的数"<<endl;
cin>>oldNum;
cout<<"请输入转换后的数的进制数"<<endl;
cin>>newBase;
transition a(oldNum,newBase,oldBase);
fun(a);
cin.get();
return 0;
}
10
.5
9
就就会因为尾数一直是.5而陷入死循环啊,这怎么破啊,谢谢了
[ 本帖最后由 a99875984 于 2013-4-2 14:38 编辑 ]