usaco training题集 y总强推,直接在题库搜
本题考点:
- 十进制转换为b进制
- 双指针判断回文数
考点:
- 十进制转化成其他进制:短除法
// 将数字转换为字符
char get(int x)
{
if(x <= 9) return x + '0';
else return x - 10 + 'A';
}
// 进制转换,十进制转换为b进制
string base(int n,int b)
{
string num;
while(n){
num += get(n % b), n /= b;
}
reverse(num.begin(),num.end());
return num;
}
2.其他进制转化成十进制:秦九韶算法
// 将字符转换为数字
int uget(char c)
{
if(c <= '9') return c - '0';
return c - 'A' + 10;
}
// 将b进制转换为十进制,秦九韶算法
int base10(string num, int b)
{
int res = 0;
for(auto c : num)
res = res * b + uget(c);
return res;
}
3.其他进制转化成其他进制
(1) 用十进制过渡
(2) 短除法
(3) 扩展题:124. 数的进制转换
1.十进制转换为b进制
#include <iostream>
#include <algorithm>
using namespace std;
// 将数字转换为字符
char get(int x)
{
if(x <= 9) return x + '0';
else return x - 10 + 'A';
}
// 进制转换,十进制转换为b进制
string base(int n,int b)
{
string num;
while(n){
num += get(n % b), n /= b;
}
reverse(num.begin(),num.end());
return num;
}
// 双指针判断是否是回文串
bool check(string num)
{
for(int i = 0 , j = num.size() - 1; i < j ; i++ , j -- )
if(num[i] != num[j])
return false;
return true;
}
int main()
{
int b;
cin >> b;
for(int i = 1;i <= 300;i ++ )
{
auto num = base(i * i, b);
if(check(num))
cout << base(i,b) << ' ' << num << endl;
}
return 0;
}
2.b进制转换为十进制,秦九韶算法
#include <iostream>
#include <algorithm>
using namespace std;
// 将数字转换为字符
char get(int x)
{
if(x <= 9) return x + '0';
else return x - 10 + 'A';
}
// 进制转换,十进制转换为b进制
string base(int n,int b)
{
string num;
while(n){
num += get(n % b), n /= b;
}
reverse(num.begin(),num.end());
return num;
}
// 双指针判断是否是回文串
bool check(string num)
{
for(int i = 0 , j = num.size() - 1; i < j ; i++ , j -- )
if(num[i] != num[j])
return false;
return true;
}
// 将字符转换为数字
int uget(char c)
{
if(c <= '9') return c - '0';
return c - 'A' + 10;
}
// 将b进制转换为十进制,秦九韶算法
int base10(string num, int b)
{
int res = 0;
for(auto c : num)
res = res * b + uget(c);
return res;
}
int main()
{
int b;
cin >> b;
for(int i = 1;i <= 300;i ++ )
{
auto num = base(i, b);
cout << i << ' ' << base10(num, b) << endl;
}
return 0;
}