1,计算任意两个数的阶乘的和;
2,读入20个整数,统计其中非负数的个数及非负数的和
第1个回答 2008-12-12
一,
#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
#include "math.h"
#include "malloc.h"
void calcFac(unsigned long n)
{
unsigned long i,j,head,tail;
int blkLen=(int)(n*log10((n+1)/2)); //计算n!有数数字的个数
blkLen+=4; //保险起见,多加4位
if (n<=1)
{ printf("%d!=0\n",n); return;}
char *arr=(char *)malloc(blkLen);
if (arr==NULL)
{ printf("alloc memory fail\n"); return ;}
memset(arr,0,sizeof(char)*blkLen);
head=tail=blkLen-1;
arr[tail]=1;
for (i=2;i<=n;i++)
{
unsigned long c=0;
for (j=tail;j>=head;j--)
{
unsigned long prod=arr[j] * i +c;
arr[j]=(char)( prod % 10);
c= prod / 10;
}
while (c>0)
{
head--;
arr[head]=(char)(c % 10);
c/=10;
}
}
printf("%d!=",n);
for (i=head;i<=tail;i++)
printf("%c",arr[i]+'0');
printf("\n");
free(arr);
}
void testCalcFac()
{
int n;
while (1)
{
printf("n=?");
scanf("%ld",&n);
if (n==0)
break;
calcFac(n);
}
}
int main(int argc, char* argv[])
{
testCalcFac();
return 0;
}
#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
#include "math.h"
#include "malloc.h"
void calcFac(unsigned long n)
{
unsigned long i,j,head,tail;
int blkLen=(int)(n*log10((n+1)/2)); //计算n!有数数字的个数
blkLen+=4; //保险起见,多加4位
if (n<=1)
{ printf("%d!=0\n",n); return;}
char *arr=(char *)malloc(blkLen);
if (arr==NULL)
{ printf("alloc memory fail\n"); return ;}
memset(arr,0,sizeof(char)*blkLen);
head=tail=blkLen-1;
arr[tail]=1;
for (i=2;i<=n;i++)
{
unsigned long c=0;
for (j=tail;j>=head;j--)
{
unsigned long prod=arr[j] * i +c;
arr[j]=(char)( prod % 10);
c= prod / 10;
}
while (c>0)
{
head--;
arr[head]=(char)(c % 10);
c/=10;
}
}
printf("%d!=",n);
for (i=head;i<=tail;i++)
printf("%c",arr[i]+'0');
printf("\n");
free(arr);
}
void testCalcFac()
{
int n;
while (1)
{
printf("n=?");
scanf("%ld",&n);
if (n==0)
break;
calcFac(n);
}
}
int main(int argc, char* argv[])
{
testCalcFac();
return 0;
}
参考资料: