200分悬赏C语言问题

用C程序求N的阶乘(N大于1000)要求准确到每一位
或者有个人有前后妻两老婆,每个老婆有10个小孩(汗 题目就是这样)
然后是分遗产,20个儿子排成一圈开始数数,数到85的那个退出直到剩下一个,就由那人继承遗产.由于前妻死了,后妻为了让自己的儿子继承遗产就让20个人按照她的安排站,前面9个都是淘汰了前妻的儿子,然后那个死老头发现不对,就让反方向重新数,结果最后由前妻的儿子继承了遗产,用C程序模拟出站位的排布情况.
注:数到85的人直接退出然后由他的下一位重新开始数

答案请越详细越好,答的好追加到250
QQ 305907362

//------阶乘---------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N (100000)

int overturn(char*ch)
{
int i=0;
int temp = 0;
int len = strlen(ch);
for(i=0;i<len/2;i++)
{
temp = ch[i];
ch[i] = ch[len-i-1];
ch[len-i-1] = temp;
}
return 1;
}

int product(char*a,char*b,char*c)
{
int i=0,j=0,m=1;
int lena = strlen(a),lenb =strlen(b) ,temp;
overturn(a);
overturn(b);
for(i=0;i<lena;i++)
{
for(j=0;j<lenb;j++)
{
int sum = c[i+j] + (a[i]-'0')*(b[j]-'0');
m=1;
c[i+j] = sum%10;
c[i+j+m] += sum/10;
while(c[i+j+m]>9)
{
c[i+j+m+1] += c[i+j+m]/10;
c[i+j+m] %= 10;
m++;
}
}
}
for(temp=N-1;temp>=0;temp--)
{
if(c[temp] != 0)
break;
}
for(i=0;i<=temp;i++)
{
c[i] += '0';
}
overturn(c);
return 1;
}

int facturial(int n,char *c)
{
int i=0;
char a[N];
char b[N];
memset(c,0,sizeof(char)*N);
c[0] = '1';
if(n<=1)
{
return 1;
}
memset(a,0,sizeof(char)*N);
memset(b,0,sizeof(char)*N);
for(i=2;i<=n;i++)
{
_itoa( i, a, 10 );
memcpy(b,c,strlen(c));
memset(c,0,sizeof(char)*N);
product(a,b,c);
}
return 1;
}

void main()
{
int x=99,y=99,i=N;
char c[N];
memset(c,0,sizeof(char)*N);
while(1)
{
int n = 0;
scanf("%d",&n);
facturial(n,c);
printf("%3d! = %s\n",n,c);
printf("%d\n",strlen(c));
}
}

//-----遗产问题-------
//最后十个位置就是后妻的孩子原来站的位置,第10个位置就是前妻最后胜出的那个孩子原来站的位置,最后一个数字就是前妻最后胜出的孩子调整后的位置。
//
#include <stdio.h>
#include <malloc.h>
#define N 20

void main()
{
int student[N];
int i = 0;
int j = 0;
int count = 0;
for(i=0; i<N; i++)
{
student[i] = i+1;//初始化
}
i = 0;
while(i<N)
{
if(student[j] >= 0)
count++;
if(count == 85)
{
printf("%d ",student[j]);
student[j] = -1;
count = 0;
i++;
}
j = ++j%N;
}
printf("\nThe winer is %d.\n",j);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-11-14
结果是多少
第2个回答  2007-11-14
用数组存5000位数,应该是够了,每个成员存一位数,然后就是算从1!一直往上乘一位数到你要输入的n为止,如果一个成员date[i]的值大于
10了,就进位到前面的成员date[i-1];

#include<stdio.h>
main()
{
int date[5000]={0};
int dight;
int i,j,r,k;
int n;
for(i=1;i<100+1;i++)
date[i]=0;

date[0]=1;
date[1]=1 ;
dight=1;
printf("input number:");
scanf("%d",&n);

for(i=1;i<n+1;i=i++) ////////这里是数组进位的算法
{
for(j=1;j<dight+1;j++)
date[j]*=i;
for(j=1;j<dight+1;j++)
{
if(date[j]>10)
{
for(r=1;r<dight+1;r++)
{
if(date[dight]>10)
dight++;
date[r+1]+=date[r]/10;
date[r]=date[r]%10 ;
}
}
}

if(i==n)//////////////这里是输出
{
printf("%d! = ",i);
for(k=dight;k>0;k--)
printf("%d",date[k]);
printf("\n\n");
}} }
第3个回答  2007-11-23
*-----------1-----------*/

#include <stdio.h>
#include <math.h>
#define PI 3.14159265359
#define e 2.71828182846

int fact_digit(int n)
{
double digit=(0.5*log(2*n*PI)+n*log(n/e))/log(10);
return (int)digit+1;
}//计算n!的位数,参考 http://heymu.com/t/use-stirling-do-factorial-by-myheimu.htm

int main()
{
unsigned int N;
int tmp,carry,i,j,digit;int product=1;//计算N!时使用的临时变量
short *Nfact;//保存N!的数组 为了提高效率,采用10000进制
printf("N="); scanf("%d",&N);//输入N
digit=fact_digit(N)%4?fact_digit(N)/4+1:fact_digit(N)/4;//计算保存N!所需的空间
Nfact=(short*)malloc(digit*sizeof(short));//分配空间
memset(Nfact,0,digit*sizeof(short));Nfact[0]=1;//初始化

//计算部分
for(i=1;i<=N;++i)
{
for(j=carry=0;j<digit;++j)
{
tmp=Nfact[j]*i+carry;
carry=tmp/10000;
Nfact[j]=tmp%10000;
}
}

//输出部分
printf("(%d!)=%d",N,Nfact[digit-1]);
for(i=digit-2;i>=0;--i)
printf("%04d",Nfact[i]);
printf("\n结果共有%d位\n",fact_digit(N));

return 0;
}

/*-----------2-----------*/

#include <stdio.h>
#define N 20
#define M 85

int main()
{
int son[N];
int i,j,count;
for(i=0; i<N; i++) son[i]=0;//一开始不知道20个儿子是谁的,标为0

//前9个出列的是前妻的儿子,标为1
i=1,j=0,count=0;
while(i<=9)
{
if(son[j%N]==0)
{
if(++count==M)
{
son[j%N]=1;
count=0;
i++;
}
}
j++;
}

//反过来报数,前10个出列的是后妻的儿子,标为-1
i=1,count=0;
while(i<=10)
{
if(son[j%N]==0)
{
if(++count==M)
{
son[j%N]=-1;
count=0;
i++;
}
}
j+=N-1;//即j--,为了处理方便改为j+=N-1
}

//剩下一个son[x]==0为胜利者

for(i=0;i<N;++i)
printf(son[i]==-1?"后":"前");
for(i=0;i<N;++i)
if(son[i]==0) {printf("\nThe winner is %d.\n",i+1); break;}

}
回答者:Is_it_right - 高级经理 六级 11-14 13:35
结果是多少
回答者:晕鸡 - 助理 二级 11-14 14:00
用数组存5000位数,应该是够了,每个成员存一位数,然后就是算从1!一直往上乘一位数到你要输入的n为止,如果一个成员date[i]的值大于
10了,就进位到前面的成员date[i-1];

#include<stdio.h>
main()
{
int date[5000]={0};
int dight;
int i,j,r,k;
int n;
for(i=1;i<100+1;i++)
date[i]=0;

date[0]=1;
date[1]=1 ;
dight=1;
printf("input number:");
scanf("%d",&n);

for(i=1;i<n+1;i=i++) ////////这里是数组进位的算法
{
for(j=1;j<dight+1;j++)
date[j]*=i;
for(j=1;j<dight+1;j++)
{
if(date[j]>10)
{
for(r=1;r<dight+1;r++)
{
if(date[dight]>10)
dight++;
date[r+1]+=date[r]/10;
date[r]=date[r]%10 ;
}
}
}

if(i==n)//////////////这里是输出
{
printf("%d! = ",i);
for(k=dight;k>0;k--)
printf("%d",date[k]);
printf("\n\n");
}} }
回答者: yiouzhou - 经理 四级 11-14 23:23
飞燕版的阶乘计算:(牛逼!)

#include<stdio.h>
#define N 1000 //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()//雨中飞燕之作
{
for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
s[a]=(b+=s[a]*t)%10000,b/=10000;
for(printf("%d",s[*s]);--*s>0;)printf("%04d",s[*s]);
return 0;
}
在VC6,DevC,Code::Block上测试,算1000!用时毫秒级

附1000!的精确值:
40238726007709377354370243392300398571937486421071463254379991042993851239862902
05920442084869694048004799886101971960586316668729948085589013238296699445909974
24504087073759918823627727188732519779505950995276120874975462497043601418278094
64649629105639388743788648733711918104582578364784997701247663288983595573543251
31853239584630755574091142624174743493475534286465766116677973966688202912073791
43853719588249808126867838374559731746136085379534524221586593201928090878297308
43139284440328123155861103697680135730421616874760967587134831202547858932076716
91324484262361314125087802080002616831510273418279777047846358681701643650241536
91398281264810213092761244896359928705114964975419909342221566832572080821333186
11681155361583654698404670897560290095053761647584772842188967964624494516076535
34081989013854424879849599533191017233555566021394503997362807501378376153071277
61926849034352625200015888535147331611702103968175921510907788019393178114194545
25722386554146106289218796022383897147608850627686296714667469756291123408243920
81601537808898939645182632436716167621791689097799119037540312746222899880051954
44414282012187361745992642956581746628302955570299024324153181617210465832036786
90611726015878352075151628422554026517048330422614397428693306169089796848259012
54583271682264580665267699586526822728070757813918581788896522081643483448259932
66043367660176999612831860788386150279465955131156552036093988180612138558600301
43569452722420634463179746059468257310379008402443243846565724501440282188525247
09351906209290231364932734975655139587205596542287497740114133469627154228458623
77387538230483865688976461927383814900140767310446640259899490222221765904339901
88601856652648506179970235619389701786004081188972991831102117122984590164192106
88843871218556461249607987229085192968193723886426148396573822911231250241866493
53143970137428531926649875337218940694281434118520158014123344828015051399694290
15348307764456909907315243327828826986460278986432113908350621709500259738986355
42771967428222487575867657523442202075736305694988250879689281627538488633969099
59826280956121450994871701244516461260379029309120889086942028510640182154399457
15680594187274899809425474217358240106367740459574178516082923013535808184009699
63725242305608559037006242712434169090041536901059339838357779394109700277534720
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000
第4个回答  2007-11-23
建议楼主把分给早答出第一个的来,第二个问题不难,第一个有水平
第5个回答  2007-11-24
试一下
long fac(int n)
{
if(n==1)
return (1);
return (n*fac(n-1));
}
void main()
{
cout<<fac(1000)<<endl;
}