| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 630 人关注过本帖
标题:[求助]进制转换中字符读入问题
只看楼主 加入收藏
pingscorpio
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-3-29
收藏
 问题点数:0 回复次数:3 
[求助]进制转换中字符读入问题
程序中给大家很多数对,为各个数对选择一个最小的基数,使这俩个数在其选择的基数上是一样的。
如5和12,12(base 3)=5(base 6),因为12(base 3)就是10进制的5,5(base 6)也是10 进制的5。
如何读入10进制以上的字符,A---Z表示10----35,要用文件读入,
样例输入文件(base.in):(最后一行用0表示输入结果)
12 5
10 A
12 34
123 456
1 2
10 2
0
输出文件:(base.out):
12(base 3)=5 (base 6)
10 (base 10)=A (base 11)
12 (base 17)=34(base 5)
123 is not equal to 456 in any base 2...36
1 is not equal to 2 in any base 2...36
10 (base 2)=2 (base 3)


现在的问题是10进制内的我已全部搞定,10进制以外的如何读入?
搜索更多相关主题的帖子: 进制 字符 
2006-05-31 21:51
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
为什么你可以搞定10进制以内的,其他的搞不定呢?不是一样的原理吗?
都是把数据当字符串读入,然后如果读入的isdigit(ch);就ch-'0';
否则就ch-'7';全部存入数组,然后在不同的位上乘以不同的进制的次方数
比如在个位数上就是乘以进制数的0次方~!

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-01 12:46
seablue1023
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2006-5-26
收藏
得分:0 

楼主的问题我想过了,并写出了代码,供楼主参考
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<math.h>

/*******************************************************************************
declare class Radix
*******************************************************************************/

class Radix //定义处理结果的累
{
private:
ostream& out; //该类有两个数据成员,一个输入流和一个输出流
istream& in;
char max(char*); //找出数中最大的数,将从文件中读取的数看成是字符串,以便处理
int toInteger(char); /*将字符转换成整数,如字符'1'(ASCII为49)换成整数1,'A'(ASCII为65)
转换成10*/
int toDecimal(char*,int base);/*将给定的字符序列转换成以base为基数的整形值,如12如果以
3为基数其值为10进制的5*/
int adjust(char*,char*,int&,int&);/*对两个给定的字符序列进行基数调整,直到他们在某两个
基数下相等*/
public:
Radix(ostream&,istream&); //构造函数
void process(); //对一个文件中的所有数对进行处理
};

/*******************************************************************************
define the function of class Radix
*******************************************************************************/

Radix::Radix(ostream& outP,istream& inP):out(outP),in(inP)
{
}

char Radix::max(char* p)
{
int len=strlen(p);
char ch=p[0];
for(int i=1;i<len;i++)
if(p[i]>ch)
ch=p[i];
return ch;
}

int Radix::toInteger(char ch) /*将字符转换成整数,如字符'1'(ASCII为49)换成整数1,'A'(ASCII为65)
转换成10*/
{
int result;
if(ch>=48&&ch<=57)
result=ch-48;
else if(ch>=65&&ch<=80)
result=ch-55;
else if(ch>=97&&ch<=122)
result=ch-87;
else
result=-1;
return result;
}

int Radix::toDecimal(char* p,int base)/*将给定的字符序列转换成以base为基数的整形值,如12如果以
3为基数其值为10进制的5*/
{
int len,result=0,temp,i,j;
len=strlen(p);
for(i=len-1,j=0;i>=0;i--,j++)
{
temp=toInteger(p[i]);
result=result+(int)(temp*pow(base,j));
}
return result;
}

int Radix::adjust(char* p1,char* p2,int& base1,int& base2)/*对两个给定的字符序列进行基数调整,
直到他们在某两个基数下相等*/
{
int value1,value2;
char max1=max(p1);
char max2=max(p2);
base1=toInteger(max1)+1;
base2=toInteger(max2)+1;
if(strlen(p1)==1)
{ value1=toInteger(max1);
if(strlen(p2)==1)
value2=toInteger(max2);
else
{
value2=toDecimal(p2,base2);
while(value1!=value2)
{
if(value1<value2)
break;
base2++;
value2=toDecimal(p2,base2);
}
}
}
else if(strlen(p2)==1)
{
value2=toInteger(max2);
value1=toDecimal(p1,base1);
while(value1!=value2)
{
if(value2<value1)
break;
base1++;
value1=toDecimal(p1,base1);
}
}
else
{
value1=toDecimal(p1,base1);
value2=toDecimal(p2,base2);
yang: if(value1<value2)
{
while(value1!=value2&&base1<35)
{
base1++;
value1=toDecimal(p1,base1);
if(value1>value2)
goto hui;
}
}

else if(value1>value2)
{
hui: while(value1!=value2&&base2<35)
{
base2++;
value2=toDecimal(p2,base2);
if(value2>value1)
goto yang;
}
}
}
if(value2==value1)
return 0;
return 1;
}


void Radix::process() //对文件中的所有数对处理
{
char *p1,*p2;
p1=new char[10];
p2=new char[10];
int base1,base2;
in>>p1>>p2;
while(!in.eof())
{
if(!adjust(p1,p2,base1,base2))
out<<p1<<"(radix "<<base1<<")="<<p2<<"(radix "<<base2<<")\n";
else
out<<p1<<"is never equal to:"<<p2<<endl;
in>>p1>>p2;
}
delete p1,p2;
}

/*******************************************************************************
main function
*******************************************************************************/

void main()
{
ifstream in("F:\\study\\base.in"); //打开文件输入流
ofstream out("base.out"); //打开文件输出流
if(in.fail())
{
cout<<"can't open file"<<endl;
return;
}
Radix base(out,in); //创建处理对象
base.process();//让该对象对文件进行处理,将结果放入输出流中
}

不知道注释写的明白与否?


2006-06-02 18:53
pingscorpio
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-3-29
收藏
得分:0 
以下是引用wfpb在2006-6-1 12:46:00的发言:
为什么你可以搞定10进制以内的,其他的搞不定呢?不是一样的原理吗?
都是把数据当字符串读入,然后如果读入的isdigit(ch);就ch-'0';
否则就ch-'7';全部存入数组,然后在不同的位上乘以不同的进制的次方数
比如在个位数上就是乘以进制数的0次方~!

十分感谢,我没有想到用这种方法。谢了

2006-06-03 01:34
快速回复:[求助]进制转换中字符读入问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018111 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved