免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4201 | 回复: 14
打印 上一主题 下一主题

100张人民币分给7个人, 分的钱最平均的通用C实现 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-10 17:48 |只看该作者 |倒序浏览
思想:

设立7个累加器的数组。
求每人钱的平均数,
面额排序,并且从大值开始取,
每轮总是从累加值最小的开始依次发放,
加上当前面额大于平均限定值的要跳过。

根据上面说的思想,写了一个C程序。
程序接受一个值列表文件,一个值一行,
编译后的命令行格式:
./a.out -n7 sample
sample 就是值列表文件,
例如可以象下面的样子:
12
45
67
123
.
.
.
-n7 表示分成7份,可以改成其它值。
输出的第一列是和,冒号后面则是分配的值。
下面附C源码,编译通过,故意隐去显式信息,难读些,但表现不错

实现:

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char z7a2b2[]={"\
Usage:把一系列的值均分若干份,使每份之间的差最小\n\
zaver [s_file] [o_file] [-n7]\n\
-nxx 分组数,十进数\n\
zaver -h\n\
zaver -?\n\
"};

#define z05c7d 10
#define z01200 0x100

char z3455f[z01200];

FILE *z678be;
FILE *z6c33b;
FILE *z70db8;

typedef struct z424d6 zad611;
struct z424d6 {        long z2b065;
};
zad611 *z837ac;
int z88229;


typedef struct zf7de1 zfc85e;
struct zf7de1 {        int zee8e7;
int *za8b94;
int zf3364;
};
zfc85e *z13bf4;
int zbb588 = 0;

int *z18671;
int zc0005;
int z9ac1d = 0;



z62e41(z5044d, z54eca)
unsigned long *z5044d;
unsigned long *z54eca;
{
if(*z5044d == *z54eca) return 0;
if(*z5044d > *z54eca) return 1;
else    return -1;
}



z21b6b(z9f69a, z2fae2)
char *z9f69a;
zad611 *z2fae2;
{        char *ze0970, *z46f53, z38fdc;
int z3da59;
char zb208e[z01200];
char *zc94ff[z05c7d];
long zdbef3;

ze0970 = z9f69a;
z46f53 = zb208e;
while((z38fdc = *ze0970++) != 0)
{        if(z38fdc == '\n')  break;
if(z38fdc == '\t')  z38fdc = ' ';
*z46f53++ = z38fdc;
}
*z46f53 = 0;

z3da59 = 1;
zc94ff[0] = 0;
ze0970 = zb208e;
while(*ze0970 == ' ')  ze0970++;
zc94ff[z3da59++] = ze0970;
if(z3da59+1 >= z05c7d)
{        fprintf(stderr,"too much fields in a z9f69a!";
exit(1);
}
while((*ze0970 != ' ')&& *ze0970)  ze0970++;
*ze0970++ = 0;
zc94ff[z3da59] = 0;
sscanf(zc94ff[1], "%ld", &zdbef3);
z2fae2->z2b065 = zdbef3;
return;
}



zcdf7c()
{        int z7ed2f, z8cca6, z265e8, z4b9d0, zd7476;

z18671 = (int *)calloc(zc0005, sizeof(int) * zbb58;
z13bf4 = (zfc85e *)calloc(sizeof(struct zf7de1), zbb58;

for(z8cca6=zbb588-1; z8cca6 >= 0; z8cca6--)
{        z13bf4[z8cca6].zee8e7 = 0;
z13bf4[z8cca6].za8b94 = (int *)(z18671 + z8cca6*zc0005);
}
z4b9d0 = z88229 - 1;
while(z4b9d0 >= 0)
{        zd7476 = 0;
for(z8cca6=0; z8cca6 <zbb588; z8cca6++)
{        z265e8 = z837ac[z4b9d0].z2b065;
if((z13bf4[z8cca6].zee8e7 + z265e <= z9ac1d)
{        zd7476 = 1;
z13bf4[z8cca6].zee8e7 += z265e8;
*(z13bf4[z8cca6].za8b94 + z13bf4[z8cca6].zf3364++) = z837ac[z4b9d0].z2b065;
if((--z4b9d0) < 0)  break;
if(z13bf4[z8cca6].zf3364 > zc0005 - 1)
{        free(z18671);
free(z13bf4);
return(1);
}
}
}
if(zd7476 == 0)
{        z4b9d0--;
free(z18671);
free(z13bf4);
return(2);
}
qsort(z13bf4, zbb588, sizeof(struct zf7de1), &z62e41);
}
free(z18671);
free(z13bf4);
return(0);
}



zd29f9()
{        int zd7476, ze9e6a;
int z961a0 = 0;

while(1)
{        zd7476 = zcdf7c();
if(zd7476 == 1)
{        zc0005 += 2;
continue;
}
if(zd7476 == 2)
{        z9ac1d += (z9ac1d/20);
continue;
}
if(zd7476 == 0)
{        if(z9ac1d > (z13bf4[zbb588-1].zee8e7 - 1))
{        z961a0 = z9ac1d;
z9ac1d = z13bf4[zbb588-1].zee8e7 - 1;
ze9e6a = zcdf7c();
if(ze9e6a == 1)
{        zc0005 += 2;
continue;
}
else if(ze9e6a == 2)
{        z9ac1d = z961a0;
break;
}
}
}
}
}



main(z0a6fa,z1d0ee)
int z0a6fa;
char *z1d0ee[];
{        int z7ed2f,z8cca6,z91723;
char *zc4a82, *ze0970, z38fdc;
char *z0f177[z05c7d];
zad611 z75835;
int z4b9d0, z265e8, z3da59;
int za4117, zd7476;
ulong ze53ed;

z8cca6 = 0;
for(z7ed2f = 1; z7ed2f < z0a6fa; z7ed2f++)
{        zc4a82 = z1d0ee[z7ed2f];
if(*zc4a82 != '-')
zb6b0b:{        z0f177[z8cca6++] = z1d0ee[z7ed2f];
}
else
{        z91723 = 1;
switch(*(zc4a82 + 1))
{        case 0:        goto zb6b0b;
case 'n':
sscanf(*(zc4a82+2)? zc4a82+2 :z1d0ee[++z7ed2f],"%ld",&zbb58;
break;

default:fprintf(stderr,"不支持的选项!\n";
case '?':
case 'h':goto z5e3c4;
}
}
}

switch(z8cca6)
{        case 2: if((z6c33b=fopen(z0f177[1],"w")== NULL)
{        fprintf(stderr,"can't open %s\n",z0f177[1]);
exit(1);
}
case 1:        if((z678be=fopen(z0f177[0],"r")== NULL)
{        fprintf(stderr,"can't open %s\n",z0f177[0]);
exit(1);
}
if(z8cca6==1)  goto z59947;
break;

case 0:        z678be = stdin;
z59947:        z6c33b = stdout;
break;

default:fprintf(stderr,"paramter too much!\n";
z5e3c4:        fprintf(stderr,"%s\n",z7a2b2);
exit(1);
}

for(z7ed2f=0; (fgets(z3455f,z01200,z678be)!=NULL); z7ed2f++);
z7ed2f++;

za4117 = z7ed2f;

z837ac = (zad611 *)malloc(sizeof(zad611) * (z7ed2f + 2));
if(z837ac == 0)
{        fprintf(stderr,"no enough memory\n";
exit(1);
}

fseek(z678be,0l,0);
z3da59 = 0;
z88229 = 0;
ze53ed = 0;
while(fgets(z3455f,z01200,z678be) != NULL)
{        if(z3455f[0] == '\n')  continue;
ze0970 = z3455f;
if(*ze0970 == 'z')  ze0970++;
z21b6b(ze0970,&z75835);
z837ac[z88229].z2b065 = z75835.z2b065;
z88229++;
if(z88229 >= za4117)
{        printf("z837ac fulled exit!\n";
exit(1);
}
z3da59++;
ze53ed += z75835.z2b065;
}
qsort(z837ac, z88229, sizeof(struct z424d6), &z62e41);
if((zbb588==0) && (z9ac1d==0))
{        fprintf(stderr, "必须用 -n 选项指定分组数!";
exit(1);
}
if(z9ac1d==0)        z9ac1d = ze53ed/zbb588 + ze53ed/(zbb588*20);
else if(zbb588==0)                zbb588 = ze53ed/z9ac1d;
if(zc0005==0)                zc0005 = 2 + z3da59 / (zbb588-1);
if(z9ac1d < z837ac[z88229-1].z2b065)
{        z9ac1d = z837ac[z88229-1].z2b065;
}

zd29f9();

z18671 = (int *)calloc(zc0005, sizeof(int) * zbb58;
z13bf4 = (zfc85e *)calloc(sizeof(struct zf7de1), zbb58;
for(z8cca6=zbb588-1; z8cca6 >= 0; z8cca6--)
{        z13bf4[z8cca6].zee8e7 = 0;
z13bf4[z8cca6].za8b94 = (int *)(z18671 + z8cca6*zc0005);
}
z4b9d0 = z88229 - 1;
while(z4b9d0 >= 0)
{        zd7476 = 0;
for(z8cca6=0; z8cca6 <zbb588; z8cca6++)
{        z265e8 = z837ac[z4b9d0].z2b065;
if((z13bf4[z8cca6].zee8e7 + z265e <= z9ac1d)
{        z13bf4[z8cca6].zee8e7 += z265e8;
*(z13bf4[z8cca6].za8b94 + z13bf4[z8cca6].zf3364++) = z837ac[z4b9d0].z2b065;
zd7476 = 1;
z4b9d0--;
if(z4b9d0 < 0)  break;
}
}
qsort(z13bf4, zbb588, sizeof(struct zf7de1), &z62e41);
}

for(z7ed2f=0; z7ed2f<zbb588; z7ed2f++)
{
fprintf(z6c33b, "%08ld: ", z13bf4[z7ed2f].zee8e7);
for(z8cca6=0; z8cca6 < z13bf4[z7ed2f].zf3364; z8cca6++)
{
fprintf(z6c33b, "%08ld ", *(z13bf4[z7ed2f].za8b94 + z8cca6));
}
fprintf(z6c33b, "\n";
}
free(z18671);
free(z13bf4);
exit(0);
}

/* End of file */

论坛徽章:
0
2 [报告]
发表于 2007-12-27 17:15 |只看该作者

我干 大哥你好厉害啊

这程序写的。

论坛徽章:
0
3 [报告]
发表于 2007-12-27 17:22 |只看该作者
  强悍的人!思维之深邃令我叹服,在杂乱的代码中都没迷失方向

论坛徽章:
0
4 [报告]
发表于 2007-12-27 17:39 |只看该作者
靠,像是 perl 写的代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-12-27 18:01 |只看该作者
原帖由 redspider 于 2007-12-27 17:39 发表
靠,像是 perl 写的代码

该不会是 perlcc 的输出结果吧?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2007-12-27 18:02 |只看该作者
变量名居然是自动生成的,拿来做密码不错呀。

论坛徽章:
0
7 [报告]
发表于 2007-12-27 20:29 |只看该作者
。。 如果是写的程序,实在是太牛逼了。

论坛徽章:
0
8 [报告]
发表于 2007-12-27 20:40 |只看该作者
我想知道 这变量名 是怎么生成的?谁能教教我?  这代码写出来挺酷的

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2008-03-11 14:49 |只看该作者
按你喜欢的去写C,
最后再统一把变量名换掉。

论坛徽章:
0
10 [报告]
发表于 2008-03-11 16:17 |只看该作者
分钱我粉喜欢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP