主题:第80次编程比赛(08第二学期开学第一炮)
雨中飞燕 [专家分:18980] 发布于 2009-02-21 18:44:00
原79次冠军因长时间不再发帖子,故本次由本人开展
[color=0000FF]题目描述:[/color]
现在,有两个正整数A和B,例如A是345,B是478,现在,需要把B插入到A里,
而A有三位,所以有四个位置选择,所得结果分别是:
478345, 347845, 344785, 345478
我们通过对比可以知道,在这当中最小的一个是344785
这两个正整数长度不超过100000位,各个位均不包含数字0
现在的目标是,要找出插入后所能得到的最小的整数,输出这个整数
[color=0000FF]样例输入:[/color]
345 478
12345 678
12 21
12 23
[color=0000FF]样例输出:[/color]
344785
12345678
1212
1223
[color=0000FF]答题要求:[/color]
请完善以下代码(C/C++均可):
[code=c]#include <stdio.h>
#define MAXLEN 100000
//todo: 在此增加你所需要的函数或者变量或者头文件
void deal(char* a, char* b, char* c)
{
// todo: 在此补充你的处理代码
// 参数说明: a和b是输入的字符串,c要保存输出结果
}
char a[MAXLEN+1], b[MAXLEN+1], c[MAXLEN*2+1];
int main(void)
{
while (scanf("%s%s", a, b)!=EOF)
{
deal(a, b, c);
puts(c);
}
return 0;
}[/code]
其它信息:
本次比赛以公开答题代码的形式,且附以及时的测试,允许直接在本帖子讨论算法
测试内容:正确性,时间效率,空间效率,代码可读性
本次比赛结束时间3月8日 23:00
[color=FF0000]在本帖子回复广告或比赛无关内容者立即封ID及IP[/color]
最后更新于:2009-02-22 11:57:00
回复列表 (共182个回复)
171 楼
chowlea [专家分:0] 发布于 2009-03-12 22:02:00
既然还没有结束,那我也来一起,请楼主批评指正。
172 楼
雨中飞燕 [专家分:18980] 发布于 2009-03-12 22:19:00
明显不合要求,你看看题目,全部要看完
173 楼
cschentao [专家分:0] 发布于 2009-03-14 09:53:00
void deal(char* a, char* b, char* c)
{
int count = 0;
int i;
int b_idx = -1;
int idx_chg = 0;
int len_b = strlen(b);
int len_a = strlen(a);
for (i=1, i<len_b, ++i)
if b[i] > b[0]
idx_chg = 1;
else if b[i] < b[0]
idx_cha = -1;
for (i=0, i<len_a, ++i)
if a[i] > b[i]
{
i - 1 -> count;
break;
}else if a[i] = b[b_idx]
{
i + idx_chg -> count;
break;
}
for (i = 0; i <= count; ++ i)
c[++b_idx] = a[i];
for (i=0; i < len_b; ++ i)
c[++b_idx] = b[i];
for (i=count+1, i<len_a; ++i)
c[++b_idx] = b[i];
c[++b_idx] = '\0';
}
174 楼
cschentao [专家分:0] 发布于 2009-03-14 10:00:00
好久没用C写东西了,编译过不了别拍我 :)
没调,也懒得用内存拷贝优化了。思路大体这样。
有哪位得闲帮调通的话,把代码发我邮箱份 - cschentao@gmail.com。
175 楼
小令00 [专家分:1040] 发布于 2009-03-15 18:17:00
为什么题目中要有“各个位均不包含数字0”这个条件
感觉没必要
176 楼
cuecue [专家分:0] 发布于 2009-03-16 10:09:00
[code=c]
void deal(char *a, char *b, char *c)
{
// todo: 在此补充你的处理代码
// 参数说明: a和b是输入的字符串,c要保存输出结果
char *pa = a, *pb = b;
char aflag;
//memset(c, 0, MAXLEN*2 + 1);
/*! 确定 after flag */
for( pb = b+1; *pb == *b; pb++) {
;
}
aflag = *pb > *b ? 1: 0 ;
/*! 确定在哪个位置前后放置串b */
if ( aflag ) {
for(pa = a; *pa != 0 && *pa <= *b; pa++) {
*c++ = *pa;
}
} else {
for(pa = a; *pa != 0 && *pa < *b; pa++) {
*c++ = *pa;
}
}
/* 不用strcat,strcpy等库函数吧 避免重置缓存为 0 */
for (; *c = *b; c++ ,b++)
;
for (; *c = *pa; c++ ,pa++)
;
/*
strcat(c, b);
strcat(c, pa );
*/
//memset(a, 0, MAXLEN + 1);
//memset(b, 0, MAXLEN + 1)
}
[/code]
177 楼
xml621 [专家分:30] 发布于 2009-03-17 15:58:00
下面小
178 楼
xqy.1988 [专家分:0] 发布于 2009-03-17 21:42:00
这个程序算法应该还算简单吧,就把后面的数从前数的高位比较起,遇到比其最高位小或等于而后一位比最高位大就执行插入。程序不想写了,暮然回首学C已经两年了,曾经的激情已然消退。
179 楼
小令00 [专家分:1040] 发布于 2009-03-18 08:14:00
感觉题目本身就很不C:
全局变量用得很违背C的精神与结构化程序设计的原则
用了全局变量由同时有a、b、c三个参数,自相矛盾且蛇足
把deal()函数定义写在main()函数前面,小家子气,幼儿园的才这么玩
题目要求“要找出插入后所能得到的最小的整数,输出这个整数”,c数组根本毫无必要
a,b,c这种命名风格缺乏编程修养
180 楼
喝牛奶的熊 [专家分:0] 发布于 2009-03-18 10:43:00
[code=c]
#include <stdio.h>
#define MAXLEN 100000
#include <string.h>
//todo: 在此增加你所需要的函数或者变量或者头文件
void deal(char* a, char* b, char* c)
{
int pos=MAXLEN+2;
for(int i=0; i<strlen(a); i++)
{
if (a[i] < b[0])
{
i++;
if(a[i]=='\0')
{
pos=i;
//printf("11111111pos:%d\n",pos);
break;
}
}
if (a[i] > b[0])
{
pos=i;
//printf("222222pos:%d\n",pos);
break;
}
if(a[i] == b[0])
{
for(int j=1; ;j++)
{
if(b[j]=='\0')
{
pos=i;
//printf("444444pos:%d\n",pos);
break;
}
if(a[i+j]=='\0')
{
for(;j<strlen(b);j++)
{
if(b[j]<a[i])
{
pos=i;
//printf("33333pos:%d\n",pos);
}
if(b[j]>a[i])
{
pos=i+1;
//printf("hhh33333pos:%d\n",pos);
}
break;
}
}
if(a[i+j]==b[j])
{
j++;
continue;
}
if(a[i+j]<b[j])
{
pos=i+j;
//printf("55555pos:%d\n",pos);
break;
}
else
{
pos=i+j-1;
//printf("6666666pos:%d\n",pos);
break;
}
}
if(pos<MAXLEN+2)
break;
}
}
//printf("pos:%d\n",pos);
strncpy(c,a,pos);
c[pos]='\0';
strcat(c,b);
strcat(c,a+pos);
}
char a[MAXLEN+1], b[MAXLEN+1], c[MAXLEN*2+1];
int main(void)
{
// printf("please input a\n");
// scanf("%s", a);
// printf("please input b\n");
// scanf("%s", b);
// deal(a, b, c);
// puts(c);
while (scanf("%s%s", a, b)!=EOF)
{
deal(a, b, c);
puts(c);
}
return 0;
}
[/code]
我来回复