首先感谢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
综合得分乌鸦丘比特胜出。
如有不同看法,欢迎探讨。