| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1933 人关注过本帖
标题:[原创] 1000的阶乘的程序代码,好题大家分享
只看楼主 加入收藏
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
结帖率:88.89%
收藏
 问题点数:0 回复次数:7 
[原创] 1000的阶乘的程序代码,好题大家分享

/***************************************************************************/
/*** 今天,space给了我一道题,算1000的阶乘,费了5个小时编出来了,编译通过****/
/********* 可是,结果怎么看怎么不正确,又找不出原因,哎********************/
/*********1000!*************************************************************/
/*********Arthor laigaoat2005******data 2007-4-25 0:27****ver0.0.0.1********/
/****************** 有错等着改 请同行帮忙看看 **************/
/***************************************************************************/
/********调试:在C-Free 3.5中编译通过***************************************/
/***************************************************************************/
#include<stdio.h>
#include<math.h>
void gewei(int *p,int k);
void shiwei(int *p,int j);
void baiwei(int *p,int i);
void jingwei(int *p,int m);

main()
{
int arr[1500],i,j,k;
arr[996]=1;
for(i=999;i>0;i--)
for(j=999;j>0;j--)
for(k=0;k>999;k--)
{
gewei(&arr[999],k);
shiwei(&arr[998],j);
baiwei(&arr[997],i);
}
for(i=0;i<1000;i++)
{
printf("%d",arr[i]);
}
getchar();
}

void gewei(int *p,int k)
{
int i,m;
for(i=999;i>0;i++,p--)
{
m=*p*k;
if(m>9)
{
jingwei(p, m);
}
}
}

void shiwei(int *p,int j)
{
int i,m;
for(i=998;i>0;i++,p--)
{
m=*p*j;
if(m>9)
{
jingwei(p, m);
}
}
}

void baiwei(int *p,int i)
{
int i,m;
for(i=997;i>0;i++,p--)
{
m=*p*i;
if(m>9)
{
jingwei(p, m);
}
}
}

void jingwei(int *p,int m) /*用递归调用完成进位功能*/
{


int a,b,c;

if(!(m>9))
return;
else
{
a=m%10; /*取得操作位的数*/ /* 进位操作 */
b=m/10; /*取得操作位的上一位的数*/
*p=a; /*将操作位上的数填入*/
p--; /*移动指针到上一位*/
*p=b;
c=b+*p;
jingwei(p,c);
}
}

搜索更多相关主题的帖子: 阶乘 代码 分享 
2007-04-25 00:38
feelings010
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2007-4-20
收藏
得分:0 
不好意思,以我现在水平,根本就看不明白里面的意思!

2007-04-25 12:04
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
这个问题好象曾经有过.
我记得我们以前的卧龙斑竹都算到10万了.
你找找

2007-04-25 12:24
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
谢谢你,我知道了。可是我就是想把这个程序用这种方法调出来,我想知道错在哪儿了。我相信,一个问题有多种方法可以求出结果来的。

昨天我又想了好久,发现了几处明显错误,改了一些,可是现错误更明显了:1000的阶乘居然还等1000,请大家帮我看看到底是怎么了?


#include<stdio.h>
#include<math.h>
void gewei(int *p,int k); /*声明对个位数的相乘的函数*/
void shiwei(int *p,int j); /*声明对十位数的相乘的函数*/
void baiwei(int *p,int i); /*声明对百位数的相乘的函数*/
void jingwei(int *p,int m); /*当相乘的积大于10需要进位时,调用此函数完成进位功能*/

main()
{
int arr[1000]={0,0}; /*定义一个数组,存放结果的每一位数*/
int dyxh,i,j,k;
int e,f,g;
FILE *fp_new;
arr[996]=1; /*将千位数初始化为1*/
for(dyxh=0;dyxh<1000;dyxh++) /*通过三重for循环打印出 arr[1000]的初值。*/
{
printf("%d",arr[dyxh]);
}
printf("\a\n以上输出了arr[1000]的初值!大小为0…01000\n即将执行1000的阶乘!\n按任意键继续!\n");
getchar(); /*程序执行到这里暂停,便于查看分析程序*/

for(i=0;i<10;i++) /*百位上的数从0到9*/
for(j=0;j<10;j++) /*十位上的数从0到9*/
for(k=1;k<10;k++) /*个位上的数从0到9*/
{
printf("这是第%d%d%d次循环i、j、k的值:%d%d%d\n",i,j,k,i,j,k); /*从本行到两面八行将阶乘数据写入阶乘数据.txt中,以验证i,j,k的值*/
fp_new=fopen("阶乘数据.txt","a+");
if(fp_new==NULL)
{
printf("建立文件失败!\n");
}
fprintf(fp_new,"%d%d%d, ",i,j,k);
fclose(fp_new); /*经检验,文本中的数据从1到999,说明程序正确*/



for(e=1;e<1000;e++)
{
gewei(&arr[1000-e],k); /*对个位数的相乘的函数*/
}
for(f=2;f<1000;f++)
{
shiwei(&arr[1000-f],j); /*用j乘以十位数并通过进位函数完成进位*/
}
for(g=3;g<1000;g++)
{
baiwei(&arr[1000-g],i); /*用i乘以百位数并通过进位函数完成进位*/
}
}
printf("\n阶乘运算结束!\n按任意键输出arr[1000]的新值!\n");
getchar();
for(dyxh=0;dyxh<1000;dyxh++)
{
printf("%d",arr[dyxh]);
}
printf("\n输出结束!\n");
getchar();
}
void gewei(int *p,int k) /*个位处理函数*****p为arr[999](个位)的地址******k为当前数的个位数*/
{
int m;
m=*p*k;
if(m>9)
{
jingwei(p, m);
return;
}
return;
}
void shiwei(int *p,int j) /*十位处理函数****p为arr[998](十位)的地址******k为当前数的十位数*/
{
int m;
m=*p*j;
if(m>9)
{
jingwei(p, m);
return;
}
return;
}
void baiwei(int *p,int i) /*百位处理函数****p为arr[997](百位)的地址******k为当前数的个位数*/
{
int m;
m=*p*i;
if(m>9)
{
jingwei(p, m);
return;
}
return;
}
void jingwei(int *p,int m) /*进位处理函数******用递归调用完成进位功能*/
{
int a,b,c;
int *pjw;
pjw=p;

if((m<9)&&(m==9))
{
return;
}
else
{
a=m%10; /*取得操作位的数*/ /* 进位操作 */
b=m/10; /*取得操作位的上一位的数*/
*pjw=a; /*将操作位上的数填入*/
pjw--; /*移动指针到前一地址*/
c=b+*pjw;
jingwei(pjw,c);
}
return;
}
2007-04-26 09:18
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 

我又改了一下,还是不行,结果为0了.怎么回事啊?



#include<stdio.h>
#include<math.h>
void gewei(int *p,int k); /*声明对个位数的相乘的函数*/
void shiwei(int *p,int j); /*声明对十位数的相乘的函数*/
void baiwei(int *p,int i); /*声明对百位数的相乘的函数*/
void jingwei(int *p,int m); /*当相乘的积大于10需要进位时,调用此函数完成进位功能*/

main()
{
int arr[1000]={0,0}; /*定义一个数组,存放结果的每一位数*/
int dyxh,i,j,k;
int e,f,g;
FILE *fp_new;
arr[996]=1; /*将千位数初始化为1*/
for(dyxh=0;dyxh<1000;dyxh++) /*通过三重for循环打印出 arr[1000]的初值。*/
{
printf("%d",arr[dyxh]);
}
printf("\a\n以上输出了arr[1000]的初值!大小为0…01000\n即将执行1000的阶乘!\n按任意键继续!\n");
getchar(); /*程序执行到这里暂停,便于查看分析程序*/

for(i=0;i<10;i++) /*百位上的数从0到9*/
for(j=0;j<10;j++) /*十位上的数从0到9*/
for(k=1;k<10;k++) /*个位上的数从0到9*/
{


for(e=1;e<1000;e++)
{
gewei(&arr[1000-e],k); /*对个位数的相乘的函数*/
}
for(f=2;f<1000;f++)
{
shiwei(&arr[1000-f],j); /*用j乘以十位数并通过进位函数完成进位*/
}
for(g=3;g<1000;g++)
{
baiwei(&arr[1000-g],i); /*用i乘以百位数并通过进位函数完成进位*/
}
}
printf("\n阶乘运算结束!\n按任意键输出arr[1000]的新值!\n");
getchar();
for(dyxh=0;dyxh<1000;dyxh++)
{
printf("%d",arr[dyxh]);
}
printf("\n输出结束!\n");
getchar();
}
void gewei(int *p,int k) /*个位处理函数*****p为arr[999](个位)的地址******k为当前数的个位数*/
{
int m;
m=*p*k;
if(m>9)
{
jingwei(p, m);
return;
}
else
*p=m;

}
void shiwei(int *p,int j) /*十位处理函数****p为arr[998](十位)的地址******k为当前数的十位数*/
{
int m;
m=*p*j;
if(m>9)
{
jingwei(p, m);
return;
}
else
*p=m;

}
void baiwei(int *p,int i) /*百位处理函数****p为arr[997](百位)的地址******k为当前数的个位数*/
{
int m;
m=*p*i;
if(m>9)
{
jingwei(p, m);

}
else
*p=m;

}
void jingwei(int *p,int m) /*进位处理函数******用递归调用完成进位功能*/
{
int a,b,c;
int *pjw;
pjw=p;
a=m%10; /*取得操作位的数*/ /* 进位操作 */
b=m/10; /*取得操作位的上一位的数*/
*pjw=a; /*将操作位上的数填入*/
--pjw; /*移动指针到前一地址*/
c=b+*pjw;
if (c>9)
{
jingwei(pjw,c);
}
else
*pjw=c;

}

2007-04-26 13:22
!西瓜!
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-4-26
收藏
得分:0 

看不懂!!!!
2007-04-26 17:08
vistayulei
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-4-24
收藏
得分:0 
m=*p*k;这个地方的写法好像不对把,我也新手,可能我说的也不一定对,按照正常的写法应该是 m * = x 吧
2007-04-26 19:02
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
m=*p*k 我想表达的意思是将指针p指向的内容乘以k,再把值赋给m  ,我也不知道这样可不可以.请看到的同声帮帮忙啊.
2007-04-27 23:14
快速回复:[原创] 1000的阶乘的程序代码,好题大家分享
数据加载中...
 
   



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

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