华师一附中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
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[1010],b[3000];
  4. string s;
  5. int main()
  6. {
  7.         int m,n;
  8.         string x;
  9.         cin>>m>>x;
  10.         int l=x.size();
  11.         for (int i=0; i<l; i++)
  12.         {
  13.                 if (x[i]>='A')
  14.                         a[i]=x[i]-'A'+10;
  15.                 else a[i]=x[i]-'0';
  16.         }
  17.         for (int i=0; i<l; i++)
  18.         {
  19.                 b[0]=b[0]+a[i];
  20.                 for (int j=0; j<l; j++)
  21.                 {
  22.                         b[j]=b[j]*m;
  23.                         if(b[j]>=10)
  24.                                 b[j]=b[j]%10;
  25.                         b[j+1]=b[j]/10+b[j+1];
  26.                 }
  27.                 while (b[l]>0)
  28.                         l++;
  29.         }
  30.         for (int i=0; i<l; i++)
  31.                 s[i]=b[l-1-i]+'0';//m转10 (此处已出错)
  32. //////////////////////////////////////////////////////////////////////////////////
  33.         return 0;
  34. }
复制代码

作者: 孔某某某    时间: 2021-8-11 17:57
孙老师,今天的2,3题都和之前老师说过的一样,思路有了,知道该干什么,细节上做不到位
作者: 非液化    时间: 2021-8-11 18:28
  1. //m进制数转10进制
复制代码
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string x,y,b[1010];
  4. int a[10086];//×a»ˉÎaꮽøÖÆêya1y¶é ,bÎa¶Ôó|λêyμÄè¨
  5. string s="0123456789ABCDEF",ss;
  6. int m,n,lx;//m½øÖÆx×a»»Îan½øÖÆy
  7. int changeType(char xx)
  8. {
  9.         if(xx>'A'-1)
  10.         return xx-'A'+10;
  11.         else return xx-'0';
  12. }
  13. string highMul(string xx,int yy)
  14. {
  15.         int lxx=xx.size();
  16.         string t="";
  17.         int j=0;//½øλ
  18.         for(int i=lxx-1;i>=0;i--)
  19.         {
  20.                 t=char((changeType(xx[i])*yy+j)%10+'0')+t;
  21.                 j=(changeType(xx[i])*yy+j)/10;
  22.         }
  23.         while(j)
  24.         {
  25.                 t=char(j%10+'0')+t;
  26.                 j/=10;
  27.         }
  28.         return t;
  29. }
  30. void highAdd(string xx)
  31. {
  32.         int lxx=xx.size();
  33.         int t[10086];
  34.         for(int i=0;i<lxx;i++)
  35.         t[i]=changeType(xx[lxx-i-1]);
  36.         for(int i=lxx;i<10086;i++)
  37.         t[i]=0;
  38.         //cout<<t[0]<<t[1]<<t[2]<<endl;
  39.         for(int i=0;i<10086;i++)
  40.         {
  41.                 a[i]+=t[i];
  42.                 a[i+1]+=a[i]/10;
  43.                 a[i]=a[i]%10;
  44.         }
  45. }
  46. void mTo10()
  47. {
  48.         lx=x.size();
  49.         a[0]=0;
  50.         for(int i=1;i<10086;i++)
  51.         a[i]=0;
  52.         for(int i=0;i<lx;i++)
  53.         {
  54.                 if(i==0)
  55.                 {
  56.                         b[i]="1";
  57.                 }
  58.                 else
  59.                 {
  60.                         b[i]=highMul(b[i-1],m);
  61.                 }
  62.                 //cout<<b[i]<<endl;
  63.         }
  64.         for(int i=lx-1;i>=0;i--)
  65.         {
  66.                 string t="";
  67.                 t=highMul(b[i],changeType(x[lx-1-i]));
  68.                 //cout<<t<<endl;
  69.                 highAdd(t);
  70.         }
  71. }
  72. int main()
  73. {
  74.         cin>>x>>m>>n;
  75.         mTo10();
  76.         /*for(int i=0;i<10086;i++)
  77.         cout<<a[i];*/
  78.         return 0;
  79. }
复制代码


作者: 非液化    时间: 2021-8-11 21:56
本帖最后由 非液化 于 2021-8-11 21:59 编辑
  1. //小数字目测正常,大数字鬼知道正不正常
复制代码
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string x,y,b[1010];
  4. string temp[10086];
  5. int a[10086]; //转化为十进制数a过渡 ,b为对应位数的权
  6. string s="0123456789ABCDEF",ss;//字符映射表
  7. int m,n,lx; //m进制x转换为n进制y
  8. int changeType(char xx)
  9. {
  10.         if(xx>'A'-1)
  11.         return xx-'A'+10;
  12.         else return xx-'0'; //字符串转数字
  13. }
  14. string highMul(string xx,int yy)
  15. {
  16.         int lxx=xx.size();
  17.         string t="";
  18.         int j=0; //进位
  19.         for(int i=lxx-1;i>=0;i--)
  20.         {
  21.                 t=char((changeType(xx[i])*yy+j)%10+'0')+t;
  22.                 j=(changeType(xx[i])*yy+j)/10;
  23.         }
  24.         while(j) //处理最高位
  25.         {
  26.                 t=char(j%10+'0')+t;
  27.                 j/=10;
  28.         }
  29.         return t;
  30. }
  31. void highAdd(string xx)
  32. {
  33.         int lxx=xx.size();
  34.         int t[10086];
  35.         for(int i=0;i<lxx;i++)
  36.         t[i]=changeType(xx[lxx-i-1]);
  37.         for(int i=lxx;i<10086;i++)
  38.         t[i]=0;
  39.         //cout<<t[0]<<t[1]<<t[2]<<endl;
  40.         for(int i=0;i<10086;i++)
  41.         {
  42.                 a[i]+=t[i];
  43.                 a[i+1]+=a[i]/10;
  44.                 a[i]=a[i]%10;
  45.         }
  46. }
  47. void highDiv(int i)
  48. {
  49.         int c=0;
  50.         for(int j=0;j<temp[i].size();j++)
  51.         {
  52.                 c=10*c+(temp[i][j]-'0');
  53.                 temp[i+1]=temp[i+1]+char(c/n+'0');
  54.                 c=c%n;
  55.         }
  56.         while(temp[i+1][0]=='0'&&temp[i+1].size()!=0)//首位去0
  57.         {
  58.                 temp[i+1].erase(0,1);
  59.         }
  60.         //cout<<temp[i+1]<<endl;
  61.         y=s[c]+y;
  62. }
  63. void tenToN()
  64. {
  65.         for(int i=0;i<10086;i++)
  66.         {
  67.                 temp[i]="";
  68.         }
  69.         for(int i=0;i<10086;i++) //将a数组内容装入字符串t
  70.         {
  71.                 temp[0]=char(a[i]+'0')+temp[0];        
  72.         }
  73.         while(temp[0][0]=='0'&&temp[0].size()!=0)//首位去0
  74.         {
  75.                 temp[0].erase(0,1);
  76.         }
  77.         //cout<<"t"<<t<<endl;
  78.         y="";
  79.         int i=0;
  80.         while(temp[i]!="")
  81.         {
  82.                 highDiv(i);
  83.                 i++;
  84.         }
  85.         while(y[0]=='0'&&y.size()!=0)
  86.         {
  87.                 y.erase(0,1);
  88.         }
  89.         cout<<y;
  90. }
  91. void mToTen()
  92. {
  93.         lx=x.size();
  94.         a[0]=0;
  95.         for(int i=1;i<10086;i++)
  96.         a[i]=0;
  97.         for(int i=0;i<lx;i++)
  98.         {
  99.                 if(i==0)
  100.                 {
  101.                         b[i]="1";
  102.                 }
  103.                 else
  104.                 {
  105.                         b[i]=highMul(b[i-1],m);
  106.                 }
  107.                 //cout<<b[i]<<endl;
  108.         }
  109.         for(int i=lx-1;i>=0;i--)
  110.         {
  111.                 string t="";
  112.                 t=highMul(b[i],changeType(x[lx-1-i]));
  113.                 //cout<<t<<endl;
  114.                 highAdd(t);
  115.         }
  116. }
  117. int main()
  118. {
  119.         cin>>x>>m>>n;
  120.         mToTen();
  121.         /*for(int i=0;i<10086;i++)
  122.         cout<<a[i];*/
  123.         tenToN();
  124.         return 0;
  125. }
复制代码






欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2