You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:22:48