ProblemD Defining Labels (數論 Math theorm)

題目大意:

給你 x 進制 y 值且他是試算表模式,如:A,B,..,Z,AA,AB..,請嘗試將他轉回 10 進制

分析:

是我太久不會寫演算法,還是我變爛了,這題我花了兩小時才解決問題。QQ

我們先來看十進制的試算表模式與正常十進位模式

試算表模式: 0 1 2 3 4 5 6 7 8 9 00 01 02 …
十進位模式: 1 2 3 4 5 6 7 8 9 10 11 12 13 …

在試算表 0 時十進位為 1 相差 1,在試算表 00 時十進位為 11 相差 11(這裡只兩個 1 ),這讓我們找出一邏輯,只要試算表的位數在多新增一位時,就會在每位數相差 1。於是我們在多計算一位數時就先 -1,以求正確答案。
要記住轉換進位的時候先出來的數值是尾數,因為是透過不斷迭代相除完成的。
其餘剩下就是進制轉換了,用遞迴式表達:

  • \(f(x,y)\)
    • \(\text{if( x = 0 ) return ;} \)
    • \(\text{ else { f(x%y,y) , 10 - y + x % y } } \)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <bits/stdc++.h>
#define LOCAL
using namespace std;

void dfs(int x , int k){
if(!x)
return ;
x--;
dfs(x/k , k );
cout << 10 - k + x % k ;
}

int main()
{
#ifdef LOCAL
freopen("in1.txt","r",stdin);
#endif // LOCAL
int t , x , k ;
cin >> t ;
while(t--){
cin >> k >> x ;
dfs(x,k);
cout << '\n' ;
}
return 0;
}
  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: