标题:[C语言编程接龙竞赛]第一题简评
只看楼主
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
结帖率:92.86%
 问题点数:0 回复次数:9 
[C语言编程接龙竞赛]第一题简评

首先感谢yuki,乌鸦丘比特,ghy2001三位参与。

见贴:http://www.bc-cn.net/bbs/dispbbs.asp?boardid=5&id=31771&star=1#14698

对三人的程序分别说说我个的看法,欢迎大家发表看法。

先说ghy2001的程序

1。程序写得比较简单,未能满足题目要求。
2。void main() 对于main 函数是否可用void修饰请参看
http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=24305&page=1
3。参照评分标准,个人认为可得: 15(代码风格)+0(注释)+30(算法)

PS:呵呵,严格了一点。

yuki乌鸦丘比特
两人的程序都能满足题意,能比较好地完成0~1000的阶乘计算及输出。
1。代码风格方面yuki做得比较完美,可得 20
乌鸦丘比特虽然也还不错,但与yuki相比还有欠缺,得 15

2。注释方面,在算法关键处两人都有比较详尽注释,都可得 20

3。最终决定胜负的算法,我做了如下测试:
编译器:C-Free 3.5
系统:win me 无任何其它运行程序 command 下测试

修改乌鸦丘比特
程序如下:

#include <stdio.h>
#include <time.h>
#include <dos.h>
/*可以调整MAXW来调整程序能承受的最大位数*/
#define MAXW 10000
int ans[MAXW];
clock_t start,end ;
void oprate(int n)
{
/*a为每次要乘的数,up保存进位,max保存目前答案最大位数*/
int a,i,up,tmp,max ;

ans[0]=1 ;
up=0 ;
max=1 ;
for(a=2;a<=n;a++)
{
for(i=0;i<max;i++)
{
/*高精度乘法*/
tmp=ans[i]*a+up ;
ans[i]=tmp%10 ;
up=tmp/10 ;
}

while(up)
{
ans[i++]=up%10 ;
up/=10 ;
}
max=i ;
/*新的最高位*/
}

//while(max--)
//printf("%d",ans[max]);
//printf("\n");

//屏蔽输出

}

int main(void)
{
// int n ;


// while(scanf("%d",&n)==1)
start = clock();
for(int i=0;i<50;i++)//计算50次1000!所需时间
{
/*输入任意数字字符程序即结束*/
oprate(1000);
}
end = clock();
printf("The time was: %f\n", (end - start) / CLK_TCK);
return 0 ;
}

分别测得三次,结果如下:
1.The time was: 7.970000
2.The time was: 7.970000
3.The time was: 7.960000

yuki
的程序计算N!部分未做成子函数,测试时有些麻烦,我做了两种方案的测试。

一,不计算对array数组及vaild_bit 初始化时间

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <dos.h>
#include <mem.h>

#define BUFFER_SIZE 2568
#define DELIMITER_WIDTH 4
clock_t start,end;
/* Holding the result */
static int array[BUFFER_SIZE] = {0};
/* Holding the data length */
static int vaild_bit = 1;
void fun(int N);
int main() {
// int N;
float t=0;
start = clock();
for(int i=0;i<50;i++)//同样计算50次1000!所需时间
{
// printf("Input N = ");
// scanf("%d",&N);
/* Judge the data which inputed by user */
// if(N < 0 || N > 1000) {
// printf("Impossible!\n");
// getch();
// return 0;
//}
//else {
memset(array,0,BUFFER_SIZE);
vaild_bit = 1;//要重复计算,这是必须的
start = clock();
fun(1000);
end = clock();
t=t+(end - start) / CLK_TCK;

//}
}

printf("\n\nThe time was: %f\n", t);
return 0;
}
void fun(int N)//计算部分写成子函数
{
//start = clock();
/* Set the base number as 1 */
array[0] = 1;
/* Integer varible i and j functioned as counter, temp using to calc */
register int i = 1,j,k,temp = -1;
/* General mutiplication */
while(i <= N) {
for(j = 0; j < vaild_bit; ++j) {
array[j] *= i;
if(temp >= 0) {
array[j] += temp/10;
temp = -1;
}
if(array[j] < 10 && j == vaild_bit-1) break;
else if(array[j] < 10) {
temp = -1;
continue;
}
temp = array[j];
array[j] = temp % 10;
/* Extend a bit for a new result */
if( temp+array[j+1]*(i+1) >= 10 && j == vaild_bit-1 ) ++vaild_bit;
}
/* Reset the length of new data */
vaild_bit = j + 1;
++i;
}
/* Result published */
// printf("%d!(%d bit(s)) = \n",N,vaild_bit);
// for( i = vaild_bit - 1; i >= 0; --i ) {
// printf("%d",array[i]);
/* Every four figures delimited by a space */
// if(!(i % DELIMITER_WIDTH)) putch(0x20);
// }
// printf("\n"); //屏蔽输出
}

分别测得三次,结果如下:
1.The time was: 34.929985
2.The time was: 35.039986
3.The time was: 34.939983

二,计入对array数组及vaild_bit 初始化时间

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <dos.h>
#include <mem.h>

#define BUFFER_SIZE 2568
#define DELIMITER_WIDTH 4
clock_t start,end;
/* Holding the result */
static int array[BUFFER_SIZE] = {0};
/* Holding the data length */
static int vaild_bit = 1;
void fun(int N);
int main() {
// int N;
start = clock();
for(int i=0;i<50;i++)//同样计算50次1000!所需时间
{
// printf("Input N = ");
// scanf("%d",&N);
/* Judge the data which inputed by user */
// if(N < 0 || N > 1000) {
// printf("Impossible!\n");
// getch();
// return 0;
//}
//else {
memset(array,0,BUFFER_SIZE);
vaild_bit = 1;//要重复计算,这是必须的

fun(1000);
//}
}

end = clock();

printf("\n\nThe time was: %f\n", (end - start) / CLK_TCK);
return 0;
}
void fun(int N)//计算部分写成子函数
{
//start = clock();
/* Set the base number as 1 */
array[0] = 1;
/* Integer varible i and j functioned as counter, temp using to calc */
register int i = 1,j,k,temp = -1;
/* General mutiplication */
while(i <= N) {
for(j = 0; j < vaild_bit; ++j) {
array[j] *= i;
if(temp >= 0) {
array[j] += temp/10;
temp = -1;
}
if(array[j] < 10 && j == vaild_bit-1) break;
else if(array[j] < 10) {
temp = -1;
continue;
}
temp = array[j];
array[j] = temp % 10;
/* Extend a bit for a new result */
if( temp+array[j+1]*(i+1) >= 10 && j == vaild_bit-1 ) ++vaild_bit;
}
/* Reset the length of new data */
vaild_bit = j + 1;
++i;
}
/* Result published */
// printf("%d!(%d bit(s)) = \n",N,vaild_bit);
// for( i = vaild_bit - 1; i >= 0; --i ) {
// printf("%d",array[i]);
/* Every four figures delimited by a space */
// if(!(i % DELIMITER_WIDTH)) putch(0x20);
// }
// printf("\n"); //屏蔽输出
}

分别测得三次,结果如下:

1.The time was: 35.090000
2.The time was: 35.100000
3.The time was: 35.050000


从以上测试数据,我的结论是:

乌鸦丘比特 得算法分 60
yuki
得算法分 50

综合得分乌鸦丘比特
胜出。

如有不同看法,欢迎探讨。






  

搜索更多相关主题的帖子: C语言 简评 接龙 竞赛 
2005-10-30 21:45
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

如无异议乌鸦丘比特是本届优胜者,即下届出题人。希望乌鸦丘比特见贴后及时公布下届[C语言编程接龙竞赛]出题时间及相关事项。

http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=31744&page=1

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <time.h>
#include <stdlib.h>

#define CARRY 100000

clock_t start,end ;

int GetFactorialMemSize(int n);
long*InitiFactorialMem(int Size);
int Factorial(register long*FactorialMem,int n);
void PrintFactorial(long*FactorialMem,int Start);

int main(void)
{
int N,FactorialStart,FactorialMemSize ;
long*PFactorial ;
char Key='y' ;

while(Key=='y'||Key=='Y')
{
printf("N=?");
while(scanf("%d",&N)!=1)getchar();
FactorialMemSize=GetFactorialMemSize(N)/5+1 ;
PFactorial=InitiFactorialMem(FactorialMemSize);
start=clock();
FactorialStart=Factorial(PFactorial,N);
end=clock();
printf("\n计算%d!花费: %f 秒\n按回车打印....\n\n",N,(float)(end-start)/CLK_TCK);
getchar();
getchar();
start=clock();
PrintFactorial(PFactorial,FactorialStart);
end=clock();
printf("\n\n输出%d!花费: %f 秒\n",N,(float)(end-start)/CLK_TCK);
free(PFactorial);
printf("继续? y 或 Y 退出? 任意键\n");
Key=getchar();
}
return 0 ;
}
/*-----------------------------------------------------------------*/
int GetFactorialMemSize(int n)
{
double sum=1.0 ;
int i ;

for(i=1;i<=n;i++)
sum+=log10((long double)i);

return(int)sum ;
}
/*-------------------------------------------------------------------*/
long*InitiFactorialMem(int Size)
{
long*FactorialMem=(long*)calloc(Size,sizeof(long));
if(!FactorialMem)
{
printf(" Allocation Error !\n");
exit(0);
}

return FactorialMem ;
}
/*------------------------------------------------------------------*/
int Factorial(register long*FactorialMem,int n)
{
int NotZero=0,End=0,i,j ;
long int CARRY_number ;
register long int tem ;

FactorialMem[0]=1 ;
for(i=1;i<=n;i++)
{
CARRY_number=0 ;
for(j=NotZero;j<=End;j++)
{
tem=FactorialMem[j]*i+CARRY_number ;
CARRY_number=tem/CARRY ;
FactorialMem[j]=tem%CARRY ;
}
while(!FactorialMem[NotZero])NotZero++;
if(CARRY_number)FactorialMem[++End]=CARRY_number ;
}

return End ;
}
/*-------------------------------------------------------------------*/
void PrintFactorial(long*FactorialMem,int Start)
{
printf("%ld",FactorialMem[Start--]);
while(Start>=0)printf("%.5ld",FactorialMem[Start--]);
}

[此贴子已经被作者于2005-11-1 20:09:38编辑过]


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-10-30 21:52
wenyong
Rank: 1
等 级:新手上路
帖 子:251
专家分:0
注 册:2005-8-9
得分:0 
能不能出个简单又经典的呢 ?

2005-10-31 12:32
ghy2001
Rank: 1
等 级:新手上路
威 望:1
帖 子:87
专家分:0
注 册:2005-10-30
得分:0 
我c语言上课学的都是void main() ,好几百号人啊。

2005-10-31 12:41
古墨生香
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2005-9-15
得分:0 
我支持这种形式的游戏,大家可以互相交流,很好的

2005-10-31 23:43
city505
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2005-11-5
得分:0 

请问一下我们能不能参加啊!
怎么样参加,要具备那些条件啊!

2005-11-05 13:47
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

任何想参与的人都可以参与,搞这个活动只是想提高大家学习C的趣味性以及能在活动中了解自己的不足,学习别人的长处,提高C水平。

每次活动都可以在置顶贴中找到。

可能,这两次的题对初学者来说有些难度,每个人都可以提供难度适宜的赛题。


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-11-05 14:04
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 

knocker 评价的有理,我还有很多东西要像大家学习,我花了点时间重新改进了下算法,knocker有空能帮我测试一下吗,谢谢啦。我用dev-C++编译后无法正确计算时间开销,方法与knocker之前提供的方法类似,不知为何,总是输出0.000000秒,下面贴上我改良后的算法。

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <mem.h>

/*
-- Program detail -----------
Programmer : yuki
Last modify date: 2005-10-29
-----------------------------
*/

/*
NOTICE: If you want to placed this code to another bbs, please note the origin
*/

/* Macro definition as buffer size */
#define BUFFER_SIZE 3000
#define DELIMITER_WIDTH 4

/* Holding the result */
static int array[BUFFER_SIZE] = {0};
/* Holding the data length */
static int vaild_bit = 1;

clock_t start,end;

void func(int N) {
register int i = 2,j,temp = 0;
/* Set the base number as 1 */
array[0] = 1;
/* General mutiplication */
while(i <= N) {
for(j = 0; j < vaild_bit; ++j) array[j] *= i;
for(j = 0; j < vaild_bit; ++j) {
if(array[j] >= 10) {
temp = array[j];
array[j] = temp % 10;
array[j+1] += temp / 10;
/* Extend a bit for a new result */
//if( array[j+1] != 0 && j == vaild_bit-1 ) ++vaild_bit;
if( j == vaild_bit-1 ) ++vaild_bit;
}
}
/* Reset the length of new data */
++i;
}
}

int main() {
int N;
printf("Input N = ");
scanf("%d",&N);
/* Judge the data which inputed by user */
if(N < 0 || N > 1000) {
printf("Impossible!\n");
getch();
return 0;
}
else {
register int i=0,j;
clock_t s1,e1;
float t=0;
start=clock();
for(i=0;i<50;i++) {
s1=clock();
for(j=0;j<BUFFER_SIZE;j++) array[j]=0;
vaild_bit = 1;//要重复计算,这是必须的
e1=clock();
t+=(e1-s1)/CLK_TCK;
func(N);
}
end=clock();

/* Result published */
printf("%d!(%d bit(s)) = \n",N,vaild_bit);
for( i = vaild_bit - 1; i >= 0; --i ) {
printf("%d",array[i]);
/* Every four figures delimited by a space */
if(!(i % DELIMITER_WIDTH)) putch(0x20);
}
printf("\n");
printf("%f\n",(end-start)/CLK_TCK-t);
getch();
}
return 0;
}


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-11-10 11:21
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
knocker昏迷中......

我帮你测了一下,10秒

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2005-11-10 11:44
zwk035
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2005-10-28
得分:0 
2005-11-16 18:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-31993-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.337036 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved