ACSL算法题C#实现字符计数错误排查求助
ACSL算法题计数错误排查
问题说明
输入三个整数:生成的数值个数n、2-9之间的进制b、该进制下的起始值s(不超过16位)。
输出十进制数:生成的序列中,b进制的最大数字(即b-1)出现的总次数。
示例:n=15,b=8,s=2时,生成8进制序列2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,最大数字7出现2次,输出2。
代码实现
static void Main(string[] args) { Console.WriteLine(TheFunc(25,5,324)); // 预期输出24,实际输出10 } public static int TheFunc(int n, int b, int s) { List<string> num = new List<string>(); string temp = ""; int SumCount = 0; for (int i = 0; i < n; i++) { num.Add(ChangeBaseEX(s + i, b)); } foreach (var single in num) { temp += single; } SumCount = temp.Length - temp.Replace((b - 1).ToString(), "").Length; return SumCount; } public static string ChangeBaseEX(int num, int changeto) { string TheNumber = ""; int RestNumber = 0; while (num > 0) { RestNumber = num % changeto; TheNumber = RestNumber.ToString() + TheNumber; num = num / changeto; //num/=changeto } return TheNumber; }
测试异常
当输入(25,5,324)时,代码输出10,但正确结果应为24。
已尝试操作
- 验证
ChangeBaseEX进制转换函数与在线工具结果一致,无问题; - 打印所有生成值,计数逻辑表面正常;
- 改写多种计数方式,问题依旧;
- 单步调试未发现明显异常。
错误根源
核心问题是误解了起始值s的含义:题目中s是b进制下的起始值,但代码直接将s当作十进制数来计算s+i,导致生成的序列完全不符合题目要求。
比如测试用例中,s=324是5进制数,转换为十进制应为:3*5² + 2*5 + 4 = 75 + 10 + 4 = 89
但代码直接使用十进制的324作为起始值,生成的是324到348的十进制数转5进制,统计其中数字4的次数自然和预期不符。
修正方案
新增一个函数,将b进制的数字(以整数形式传入,实际为b进制字符串的数值)转换为十进制:
public static int BaseToDecimal(int baseNum, int b) { string numStr = baseNum.ToString(); int decimalValue = 0; foreach (char c in numStr) { int digit = c - '0'; decimalValue = decimalValue * b + digit; } return decimalValue; }
然后在TheFunc中,先将起始值s转换为十进制,再生成序列:
public static int TheFunc(int n, int b, int s) { List<string> num = new List<string>(); string temp = ""; int SumCount = 0; // 新增:将b进制的s转换为十进制起始值 int startDecimal = BaseToDecimal(s, b); for (int i = 0; i < n; i++) { num.Add(ChangeBaseEX(startDecimal + i, b)); } foreach (var single in num) { temp += single; } SumCount = temp.Length - temp.Replace((b - 1).ToString(), "").Length; return SumCount; }
修正后,输入(25,5,324)即可得到正确输出24。
内容的提问来源于stack exchange,提问作者Han Han
相关产品推荐
相关产品推荐

