求.NET中十进制转特殊三进制的C#实现(自定义映射规则)
嘿,我完全懂你要的这种特殊三进制转换——常规的进制转换会把3转成BA,但你需要的是从A开始连续映射,0→A、1→B、2→C、3→AA……对吧?下面是实现思路和完整的C#代码:
核心思路
这个转换的本质是把十进制数n映射到一组按长度优先+同长度字典序排列的三进制字符串(A/B/C对应0/1/2),具体逻辑:
- 先按字符串长度排序:1位字符串在前,然后是2位、3位……
- 同长度的字符串按字典序排列(A < B < C)
- 索引从0开始,刚好匹配你的映射规则
具体步骤:
- 特殊情况处理:输入为0时直接返回"A"
- 确定字符串长度:找到
n所在的字符串长度k,前m种长度的字符串总数为(3^(m+1)-3)/2(比如前1种长度的总数是3,对应0-2) - 计算偏移量:用
n减去前k-1种长度的总数,得到当前长度下的索引pos - 转三进制补零:把
pos转成k位三进制数,不足位补0 - 字符替换:将三进制的0→A、1→B、2→C,得到最终结果
C# 实现代码
public static string DecimalToSpecialTernary(int n) { if (n < 0) throw new ArgumentOutOfRangeException(nameof(n), "输入必须是非负整数"); // 处理0的特殊情况 if (n == 0) return "A"; // 确定目标字符串的长度k int k = 1; long total = 3; // 前k种长度的总数,初始为1位字符串的总数 while (n >= total) { k++; total = (PowerOf3(k + 1) - 3) / 2; } // 计算当前长度下的偏移量pos long previousTotal = (PowerOf3(k) - 3) / 2; int pos = n - (int)previousTotal; // 将pos转换为k位三进制字符串,前面补0 string ternary = Convert.ToString(pos, 3).PadLeft(k, '0'); // 替换字符:0→A,1→B,2→C char[] resultChars = ternary.ToCharArray(); for (int i = 0; i < resultChars.Length; i++) { resultChars[i] = resultChars[i] switch { '0' => 'A', '1' => 'B', '2' => 'C', _ => resultChars[i] }; } return new string(resultChars); } // 自定义3的幂计算,避免Math.Pow的精度问题 private static long PowerOf3(int exponent) { long result = 1; for (int i = 0; i < exponent; i++) { result *= 3; } return result; }
测试验证
跑几个例子验证效果:
DecimalToSpecialTernary(0)→ "A" ✔️DecimalToSpecialTernary(1)→ "B" ✔️DecimalToSpecialTernary(2)→ "C" ✔️DecimalToSpecialTernary(3)→ "AA" ✔️DecimalToSpecialTernary(4)→ "AB" ✔️DecimalToSpecialTernary(6)→ "BA" ✔️
如果需要处理超大数值,把参数和相关变量改成long类型即可避免溢出。
内容的提问来源于stack exchange,提问作者Hans Egil Vaaga
相关产品推荐
相关产品推荐

