华师一附中OI组
标题:
20210811网课第二题 高精度进制转换
[打印本页]
作者:
admin
时间:
2021-8-11 09:11
标题:
20210811网课第二题 高精度进制转换
输入m进制的数x,转化为n进制 m,n都在[2,16] 之间 ,x不超过1000位。
比如 输入m=10,n=2,x=10 输出1010
作者:
孔某某某
时间:
2021-8-11 17:54
#include <bits/stdc++.h>
using namespace std;
int a[1010],b[3000];
string s;
int main()
{
int m,n;
string x;
cin>>m>>x;
int l=x.size();
for (int i=0; i<l; i++)
{
if (x[i]>='A')
a[i]=x[i]-'A'+10;
else a[i]=x[i]-'0';
}
for (int i=0; i<l; i++)
{
b[0]=b[0]+a[i];
for (int j=0; j<l; j++)
{
b[j]=b[j]*m;
if(b[j]>=10)
b[j]=b[j]%10;
b[j+1]=b[j]/10+b[j+1];
}
while (b[l]>0)
l++;
}
for (int i=0; i<l; i++)
s[i]=b[l-1-i]+'0';//m转10 (此处已出错)
//////////////////////////////////////////////////////////////////////////////////
return 0;
}
复制代码
作者:
孔某某某
时间:
2021-8-11 17:57
孙老师,今天的2,3题都和之前老师说过的一样,思路有了,知道该干什么,细节上做不到位
作者:
非液化
时间:
2021-8-11 18:28
//m进制数转10进制
复制代码
#include<bits/stdc++.h>
using namespace std;
string x,y,b[1010];
int a[10086];//×a»ˉÎaꮽøÖÆêya1y¶é ,bÎa¶Ôó|λêyμÄè¨
string s="0123456789ABCDEF",ss;
int m,n,lx;//m½øÖÆx×a»»Îan½øÖÆy
int changeType(char xx)
{
if(xx>'A'-1)
return xx-'A'+10;
else return xx-'0';
}
string highMul(string xx,int yy)
{
int lxx=xx.size();
string t="";
int j=0;//½øλ
for(int i=lxx-1;i>=0;i--)
{
t=char((changeType(xx[i])*yy+j)%10+'0')+t;
j=(changeType(xx[i])*yy+j)/10;
}
while(j)
{
t=char(j%10+'0')+t;
j/=10;
}
return t;
}
void highAdd(string xx)
{
int lxx=xx.size();
int t[10086];
for(int i=0;i<lxx;i++)
t[i]=changeType(xx[lxx-i-1]);
for(int i=lxx;i<10086;i++)
t[i]=0;
//cout<<t[0]<<t[1]<<t[2]<<endl;
for(int i=0;i<10086;i++)
{
a[i]+=t[i];
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
}
void mTo10()
{
lx=x.size();
a[0]=0;
for(int i=1;i<10086;i++)
a[i]=0;
for(int i=0;i<lx;i++)
{
if(i==0)
{
b[i]="1";
}
else
{
b[i]=highMul(b[i-1],m);
}
//cout<<b[i]<<endl;
}
for(int i=lx-1;i>=0;i--)
{
string t="";
t=highMul(b[i],changeType(x[lx-1-i]));
//cout<<t<<endl;
highAdd(t);
}
}
int main()
{
cin>>x>>m>>n;
mTo10();
/*for(int i=0;i<10086;i++)
cout<<a[i];*/
return 0;
}
复制代码
作者:
非液化
时间:
2021-8-11 21:56
本帖最后由 非液化 于 2021-8-11 21:59 编辑
//小数字目测正常,大数字鬼知道正不正常
复制代码
#include<bits/stdc++.h>
using namespace std;
string x,y,b[1010];
string temp[10086];
int a[10086]; //转化为十进制数a过渡 ,b为对应位数的权
string s="0123456789ABCDEF",ss;//字符映射表
int m,n,lx; //m进制x转换为n进制y
int changeType(char xx)
{
if(xx>'A'-1)
return xx-'A'+10;
else return xx-'0'; //字符串转数字
}
string highMul(string xx,int yy)
{
int lxx=xx.size();
string t="";
int j=0; //进位
for(int i=lxx-1;i>=0;i--)
{
t=char((changeType(xx[i])*yy+j)%10+'0')+t;
j=(changeType(xx[i])*yy+j)/10;
}
while(j) //处理最高位
{
t=char(j%10+'0')+t;
j/=10;
}
return t;
}
void highAdd(string xx)
{
int lxx=xx.size();
int t[10086];
for(int i=0;i<lxx;i++)
t[i]=changeType(xx[lxx-i-1]);
for(int i=lxx;i<10086;i++)
t[i]=0;
//cout<<t[0]<<t[1]<<t[2]<<endl;
for(int i=0;i<10086;i++)
{
a[i]+=t[i];
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
}
void highDiv(int i)
{
int c=0;
for(int j=0;j<temp[i].size();j++)
{
c=10*c+(temp[i][j]-'0');
temp[i+1]=temp[i+1]+char(c/n+'0');
c=c%n;
}
while(temp[i+1][0]=='0'&&temp[i+1].size()!=0)//首位去0
{
temp[i+1].erase(0,1);
}
//cout<<temp[i+1]<<endl;
y=s[c]+y;
}
void tenToN()
{
for(int i=0;i<10086;i++)
{
temp[i]="";
}
for(int i=0;i<10086;i++) //将a数组内容装入字符串t
{
temp[0]=char(a[i]+'0')+temp[0];
}
while(temp[0][0]=='0'&&temp[0].size()!=0)//首位去0
{
temp[0].erase(0,1);
}
//cout<<"t"<<t<<endl;
y="";
int i=0;
while(temp[i]!="")
{
highDiv(i);
i++;
}
while(y[0]=='0'&&y.size()!=0)
{
y.erase(0,1);
}
cout<<y;
}
void mToTen()
{
lx=x.size();
a[0]=0;
for(int i=1;i<10086;i++)
a[i]=0;
for(int i=0;i<lx;i++)
{
if(i==0)
{
b[i]="1";
}
else
{
b[i]=highMul(b[i-1],m);
}
//cout<<b[i]<<endl;
}
for(int i=lx-1;i>=0;i--)
{
string t="";
t=highMul(b[i],changeType(x[lx-1-i]));
//cout<<t<<endl;
highAdd(t);
}
}
int main()
{
cin>>x>>m>>n;
mToTen();
/*for(int i=0;i<10086;i++)
cout<<a[i];*/
tenToN();
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2