C语言 用for循环求给定区间数的最小位数和

yks3o0rb  于 2023-02-07  发布在  其他
关注(0)|答案(3)|浏览(118)

所以,我正在做一个任务,要求找出区间[m,n]中的正整数的个数,并且数字之和最小。
我声明了一个计算数字总和的函数,但是在查找数字的数量时遇到了问题。下面是我为查找最小数字总和和计数而编写的代码。我希望我已经说清楚了。如果你能帮助我修复这个代码,我将不胜感激。
输入:1 100输出:3

int minSum(int m, int n){
  
    for (int i=m; i<=n; i++){
        int sm=sum(i);
        if (sm<min) min=sm;
        if (min==sm)  cnt++;
    }
    return cnt;
}
mkh04yzy

mkh04yzy1#

问题:

  1. cntmin未在函数中初始化(也未定义)
    1.当发现新的最小值时,cnt复位。
    您的代码很容易修复。例如:
int minSum(int m, int n){
    int cnt = 0;        // Initialize cnt
    int min = INT_MAX;  // Initialize min to a high value

    for (int i=m; i<=n; i++){
        int sm=sum(i);
        if (sm<min)
        {
            cnt = 0;   // Reset cnt
            min=sm;
        }
        if (min==sm)  cnt++;
    }
    return cnt;
}
dwbf0jvd

dwbf0jvd2#

对于初学者来说,变量mincnt没有在函数中声明,如果它们是文件作用域变量,那么在函数中使用文件作用域变量是个坏主意。
这个函数可以看起来像这样。我假设数字和不能是负数。

unsigned int minSum( int m, int n )
{
    unsigned int cnt = 0; 
    int min = 0;

    if ( !( n < m ) )
    {
        do
        {
            int sm = sum( m );
            if ( sm < min ) 
            {
                min = sm;
                cnt = 1;
            }
            else if ( !( min < sm ) )
            {
                ++cnt;
            }
        } while ( m++ != n ); 
    }

    return cnt;
}

请注意,原始代码中的for循环

for (int i=m; i<=n; i++){

可以调用未定义的行为,例如当n等于INT_MAX时。

vwkv1x7d

vwkv1x7d3#

int sum(int x)
{
    int result = 0;
    while(x) 
    {
        result += abs(x % 10);
        x /= 10;
    }
    return result;
}

size_t minSum(int m, int n){
    int min = sum(m);
    int sm;
    size_t cnt = 0;

    for (int i = m + 1; i <= n; i++)
        if ((sm = sum(i)) < min) min = sm;

    for (int i = m; i <= n; i++)
        if (sum(i) == min) cnt++;

    return cnt;
}

或者更少的暴力:

size_t minsum(int m, int n){
    int min = sum(m);
    int sm;
    size_t cnt = 1;

    for (int i = m + 1; i <= n; i++)
    {
        sm = sum(i);
        if (sm < min) 
        {
            min = sm; 
            cnt = 1;
        }
        else if(sm == min) cnt++;
    }

    return cnt;
}

相关问题