| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1648 人关注过本帖
标题:[C语言编程接龙竞赛]第一题简评
取消只看楼主 加入收藏
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
结帖率:92.86%
收藏
 问题点数:0 回复次数:2 
[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
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

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

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

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


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-11-05 14:04
快速回复:[C语言编程接龙竞赛]第一题简评
数据加载中...
 
   



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

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