44i11 @ 2023-11-26 14:39:13
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string c="0123456798ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void f(int x,int m){
if(x/m) f(x/m,m);
cout<<c[x%m];
}
int main(){
int x,m;
cin>>x>>m;
f(x,m);
return 0;
}
by ZzqAndy0728 @ 2024-07-20 20:49:09
#include <bits/stdc++.h>
using namespace std;
int main(){
int dec, toDigit;
cin >> dec >> toDigit;
// 先确定最大进制点
int maxDigit = 1;
while(maxDigit * toDigit <= dec){
maxDigit *= toDigit;
}
// 然后从最大进制点向下递减,取整得单位数,取余得余数
while(maxDigit >= 1){
int curDigit = dec / maxDigit;
if(curDigit >= 10){
cout << char('A' - 10 + curDigit);
}else{
cout << curDigit;
} dec %= maxDigit;
maxDigit /= toDigit;
}
return 0;
}
这是我的想法,我们按权展开的倒推,先把最大权值算出来,然后使用十进制数除以最大权值,得到每一位数字。我们不需要用数组存储,只需要按位输出,既简便又实用。最后十进制数取余得到新的余数继续下一个循环。别忘了最大权值要递除。
已知十进制数dec在按权展开法中是通过每一位的位值乘权值再相加得到的。那么我们倒推,已知十进制数就可以不停地除以它能得到的最大权值(因为再大后面的权值就变成负数了,不可能),取得的整数则是该位位值,余数就是下面继续除的被除数(下面所有权值×位值之和一定是dec减已完成的权值×位值之和,所以用取余运算)。
算到最后一个权值(个位,1)时,dec取余1一定为0,循环结束,输出结束。