2 条题解
-
0
基本做法:两个数转成 10 进制后再比较
做法1:每一个数位乘以对应权值
#include <bits/stdc++.h> using namespace std; int a, b; int pa[35];//pa[i]: a^i int pb[35];//pb[i]: b^i int x10,y10;//存 x,y 对应的十进制数 int xLen,yLen;//存 x,y 的位数 string x, y; int main() { cin >> a >> x; cin >> b >> y; xLen = x.length(); yLen = y.length(); //直接每一位乘以对应的权值转成十进制 //先预处理 pa、pb pa[0] = 1; for(int i=1;i<=31;i++) pa[i] = pa[i-1] * a; pb[0] = 1; for(int i=1;i<=31;i++) pb[i] = pb[i-1] * b; //算 x10,y10 x10=0; for(int i=0;i<xLen;i++) x10 += (x[i]-'0') * pa[xLen-i-1]; y10=0; for(int i=0;i<yLen;i++) y10 += (y[i]-'0') * pb[yLen-i-1]; //输出结果 if(x10==y10) cout<<"x=y"; else if(x10<y10) cout<<"x<y"; else cout<<"x>y"; return 0; }
做法2:秦九韶算法
$(32561)_{10} = (((3\times 10+2)\times 10 + 5)\times 10 + 6)\times 10+1$
#include <bits/stdc++.h> using namespace std; int a, b; int x10,y10;//存 x,y 对应的十进制数 string x, y; int main() { cin >> a >> x; cin >> b >> y; //算 x10,y10 x10 = 0; for(int i = 0; i < x.length(); i++) x10 = x10 * a + (x[i] - '0'); y10 = 0; for(int i = 0; i < y.length(); i++) y10 = y10 * b + (y[i] - '0'); //输出结果 if(x10==y10) cout<<"x=y"; else if(x10<y10) cout<<"x<y"; else cout<<"x>y"; return 0; }
-
0
33DAI很明确的给我提出了一种我完全不会但是非常方便且易于理解的进制转换思路,具体参加下图
所以本篇题解看着图一乐就行。
比较大小
运用初三学习的信息课知识可以知道,把一个n进制的数只需要从最低位开始乘n^i次方就行,其中i是从0开始递增。
比如(1011)2=(1* 2^0+1* 2^1+0 * 2^2+1 * 2^3)10
看了一眼数据范围不是很大,可以直接用暴力的幂次方算法,就不用手打快速幂了。
(才不是因为懒)gcc提供的函数库里面包含了一个叫pow的函数,具体使用方法为
pow(2,a);
就是2的a次方。这样甚至连暴力的幂算法都不需要。上代码
#include using namespace std; int a,b,x2,y2; string x,y; int main() { cin>>a>>x>>b>>y; for(int i=x.size()-1;i>=0;i--) x2+=(int)(x[i]-'0')*pow(a,x.size()-i-1); for(int i=y.size()-1;i>=0;i--) y2+=(int)(y[i]-'0')*pow(b,y.size()-i-1); if(x2>y2) cout<<"x>y"; else if(x2==y2) cout<<"x=y"; else cout<<"x<y"; return 0; }
- 1
信息
- ID
- 1123
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 52
- 已通过
- 26
- 上传者