回 帖 发 新 帖 刷新版面

主题:第47次编程比赛正式题

有一圈整数(一共n个,1<=n<=60),按顺序将其分为m(1<=m<=10)个部分,各部分内的数字相乘,所得的m个结果再相加,使它们的和最接近一个正整数x.

函数接口:
// a - 按顺序给出圈中的数字,首尾相接,且都是整数
// 给出n,m,x,返回最接近x的那个和(保证只有一个)
int abc(int n, int m, int x, int *a);

本次比赛截止时间为星期天中午12点整

回复列表 (共3个回复)

沙发

比赛开始

板凳


[em18]X是什么呀!

3 楼

没有想到什么好办法.
只好用穷举法了,望结果正确.

#include <stdio.h>
#include <assert.h>

void init_b(char *p, int n, char *p_sta, int m);
int next(char *p_in, int n);
void get_step(char *p, int n, char *p_out);
int sum(char *p_step, int m, int *p_a, int n);
int abc(int n, int m, int x, int *a);
   
int main()
{
    int a[10] = {4, 3, -2, 3, 5, 45, -34, -56, 24, -2};
    int r = abc(10, 9, -1, a);
    printf("r = %d\n", r); 
    return 0;
}

int abc(int n, int m, int x, int *a)
{
    int near = 0;
    int get_sum = 0;
    char *p_bit = (char *)malloc(n*sizeof(char));
    char *p_sta = (char *)malloc(m*sizeof(char));
    
    init_b(p_bit, n, p_sta, m);
    get_step(p_bit, n, p_sta);
    near = get_sum = sum(p_sta, m, a, n);
    while (next(p_bit, n))
    {
        get_step(p_bit, n, p_sta);
        get_sum = sum(p_sta, m, a, n);
        near = (abs(get_sum - x) < abs(near - x)) ? get_sum : near; 
    }
    
    free(p_bit);
    free(p_sta);
    
    return near;
}

void init_b(char *p, int n, char *p_sta, int m)
{
    char *p_end = p + n;
    assert(m <= n && p != NULL && p_sta != NULL);
    
    while (p < p_end)
    {    
        if (m-- > 0) 
            *p = 1;
        else
            *p = 0;
        p++;
    }
}

int next(char *p_in, int n)
{
    int i = 0;
    int c_1 = 0;
    int c_0 = 0;
    int j = 0;
    assert(p_in != NULL);
    
    while (i < n)
    {
        if (*(p_in+i) == 1)
        {
            c_1 ++;
        }
        else if (c_1>0)
        {
            *(p_in+i) = 1;
            *(p_in+i-1) = 0;
            c_1--;
            j = 0;
            while (c_1>0 && c_0>0 && p_in+j<p_in+i-j-2)
            {
                *(p_in+j) = 1;
                *(p_in+i-j-2) = 0;
                j++;
                c_1--;
                c_0--;
            }
            break;
        }
        else 
        {
            c_0++;
        }
        i++;
    }
    
    
    if (i >= n)
        return 0;
    else
        return 1;
}

void get_step(char *p, int n, char *p_out)
{
    int i, j = 0;
    for (i=0; i<n; i++)
    {
        if (*(p+i) == 1)
            *(p_out + j++) = i;
    }
}

int sum(char *p_step, int m, int *p_a, int n)
{    
    int result = 0; 
    long int mul = 1;
    int b, e, i = 0, j = 0;
    
    assert(p_step != NULL && p_a != NULL);
    if (m == 1)
    {
        while (--n >= 0)
            mul *= *(p_a + n);
        return mul;
    }
    do
    {
        mul = 1;
        j = b = *(p_step + i);
        i = ++i % m;
        e = *(p_step + i);    
        while (j != e)
        {
            mul *= *(p_a + j);
            j = ++j % n;
        }
        result += mul;
    }while (i != 0);
    
    return result;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册