主题:第47次编程比赛正式题
火海时代 [专家分:230] 发布于 2006-11-04 22:40:00
有一圈整数(一共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个回复)
沙发
火海时代 [专家分:230] 发布于 2006-11-03 18:16:00
比赛开始
板凳
lixuaong [专家分:50] 发布于 2006-11-03 19:20:00
[em18]X是什么呀!
3 楼
liren0 [专家分:260] 发布于 2006-11-04 15:10:00
没有想到什么好办法.
只好用穷举法了,望结果正确.
#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;
}
我来回复