C语言求N的阶乘,但N是任意值,也就是要考虑数据溢出的问题。不是单纯乘就可以的,应该用函数和数组。
展开全部
这个肯定要考虑采用数组实现。可以定义一个大数组,然后采用循环对数组中个每位进行加,进位操作,
更多追问追答
追问
能不能写下程序给我看看。。我想了好久哦。
追答
#include"stdafx.h"
#include
void main()
{
int n,m;
//求N的阶乘
long int a[200];
long int digit = 1;
long int temp;
long int i,j,carry;
printf("please in put n:\n");
scanf("%d",&n);
a[0] = 1;
for(i = 2; i =1;j--)
{
printf("%d",a[j-1]);
}
printf("\n%d",digit);
}
如果输入数字比较大时,请把数组开大点,更好点可以动态new数组出来,代码会更友好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在吗?QQ19116236聊一下.我做出来了.但是30以内的阶乘和计算器一样,30以上的不一样,怎么校正?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 1000
int array_char_to_int(char a[Max],int num[Max])
{
int i,j;
for(i=0,j=strlen(a)-1;j>=0;i++,j--)
{
num[i]=int(a[j])-48;
}
}
long array_fac_total(int a[Max],int n)
{
int m=0,l=1;
long k=0;
for(m=0;m<n;m++)
{
k=k+a[m]*l;
l=l*10;
}
return k;
}
int array_fac(int a[Max],int b[Max],int n,int num)
{
int m=0,l=1,i=0,j=1,k=0,p=0,temp;
for(k=n-1,i=0;k>=0;k--,i++)
{
b[i]=(a[i]*num%10+m)%10;
m=(a[i]*num+m)/10;
}
if(m>0) b[i]=m,p=i;
else p=--i;
return p;
}
int main()
{
int array_a[Max],array_b[Max],array_c[Max],n=0,i=0,j=0,m=0;
int array_ptr[Max];
long realnumber;
char *p;
char number[Max];
printf("Input a number:");
scanf("%s",number);
strtol(number,&p,10);
if(strlen(p)!=0) {printf("it is not a number!!");getchar();getchar();return 1;}
n=strlen(number);
m=n-1;
array_char_to_int(number,array_a);
realnumber=array_fac_total(array_a,n);
printf("%ld\n",realnumber);
for(i=2;i<realnumber;i++)
{
m=array_fac(array_a,array_b,m+1,i);
for(j=0;j<=m;j++) array_a[j]=array_b[j];
}
for(i=m;i>=0;i--) printf("%d",array_b[i]);
getchar();
getchar();
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 1000
int array_char_to_int(char a[Max],int num[Max])
{
int i,j;
for(i=0,j=strlen(a)-1;j>=0;i++,j--)
{
num[i]=int(a[j])-48;
}
}
long array_fac_total(int a[Max],int n)
{
int m=0,l=1;
long k=0;
for(m=0;m<n;m++)
{
k=k+a[m]*l;
l=l*10;
}
return k;
}
int array_fac(int a[Max],int b[Max],int n,int num)
{
int m=0,l=1,i=0,j=1,k=0,p=0,temp;
for(k=n-1,i=0;k>=0;k--,i++)
{
b[i]=(a[i]*num%10+m)%10;
m=(a[i]*num+m)/10;
}
if(m>0) b[i]=m,p=i;
else p=--i;
return p;
}
int main()
{
int array_a[Max],array_b[Max],array_c[Max],n=0,i=0,j=0,m=0;
int array_ptr[Max];
long realnumber;
char *p;
char number[Max];
printf("Input a number:");
scanf("%s",number);
strtol(number,&p,10);
if(strlen(p)!=0) {printf("it is not a number!!");getchar();getchar();return 1;}
n=strlen(number);
m=n-1;
array_char_to_int(number,array_a);
realnumber=array_fac_total(array_a,n);
printf("%ld\n",realnumber);
for(i=2;i<realnumber;i++)
{
m=array_fac(array_a,array_b,m+1,i);
for(j=0;j<=m;j++) array_a[j]=array_b[j];
}
for(i=m;i>=0;i--) printf("%d",array_b[i]);
getchar();
getchar();
return 0;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
递归,把N传进去 。。
更多追问追答
追问
求详细解答。
追答
long A(int N)
{
long B=1;
for(int i=N;i>0;i--)
B=B*i;
return B;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那个N有范围限制么?太大的话很难存进去啊
追问
1000以内
追答
1000的阶乘。。。。。。。。要模拟了。。不会。long long 也只能存到33.。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没看到你的要求,刚发的不对,还是删了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询