永发信息网

c语言求高精度n!用数组求怎么做

答案:2  悬赏:10  手机版
解决时间 2021-11-20 09:49
  • 提问者网友:酱爆肉
  • 2021-11-20 00:49
c语言求高精度n!用数组求怎么做
最佳答案
  • 五星知识达人网友:像个废品
  • 2021-11-20 01:37
int fun(int w)
{
if(w>1)
w=w*fun(w-1);
else if(w=1)
return 1;
else return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a;

cin>>a;
cout<
}
全部回答
  • 1楼网友:傲气稳了全场
  • 2021-11-20 02:56
涉及到大整数的问题
建议使用java的BigInteger类
用C需要编写一个函数,使用数组来储存每个位的值
这里我用C++写了一个类,你自己先看看
------------------------------------------------
//BigCount.h头文件
#include
#include
#include
#include
#include
#define MAX 1000
class BigCount{
private:
int math1[MAX],math2[MAX],mathOK[MAX];
int w1,w2;
//w1是整数1的位数 w2是整数2的位数
//char str1[MAX],str2[MAX];
public:
BigCount()
{
int i=0;
for(;i {
math1[i]=0;
math2[i]=0;
mathOK[i]=0;
}
w1=w2=0;
}

int Diversion(char *str1,char *str2)
{
int p=0,k=0;
p=strlen(str1)-1;
w1=p+1;
while(p>=0) //转换第一个大整数
{
if(*(str1+p)>'9' || *(str1+p)<'0') {cout<<"输入的数字不合法,失败!"< math1[k]=*(str1+p)-'0';
k++;
p--;
}
k=0;p=0;
p=strlen(str2)-1;
w2=p+1;
while(p>=0)
{
if(*(str2+p)>'9' || *(str2+p)<'0') {cout<<"输入的数字不合法,失败!"< math2[k]=*(str2+p)-'0';
k++;
p--;
}
if(w1>w2) k=w1-1;
if(w1<=w2) k=w2-1;
return(k); //返回值是两个整数中位数最多的那个数的位数
}

char *Add(char s1[],char s2[]) //两个整数相加的方法
{
int k=0,p=0;
int jw=0;
int w1,w2; //每个字符串的长度
char r[MAX]={'\0'},*str=r;
char str1[MAX]={'\0'},str2[MAX]={'\0'};
int math1[MAX]={0},math2[MAX]={0};
strcpy(str1,s1); //复制字符串
strcpy(str2,s2);
w1=strlen(str1);//计算长度
w2=strlen(str2);
if(w1>w2) k=w1-1; //得到两个整数的最长长度
else k=w2-1;
Diversion(str1,str2,math1,math2); //转换着两个字符串为相应的单数字数组
p=0;
while(p<=k)//依次加上每一位(在数组中)
{
mathOK[p]=math1[p]+math2[p]+jw;
if(mathOK[p]>9) {jw=1;mathOK[p]=mathOK[p]%10;}
else jw=0;
p++;
}
if(jw==1) {mathOK[p]=1;k=k+1;} //最后(最大)一位超过10,则添加一位并进位
for(p=k;p>=0;p--) //输出答案并返回这个字符串
{
r[k-p]=mathOK[p]+'0';
}
return(str);
}
void Diversion(char *str1,char *str2,int *m1,int *m2)
//对两个字符串,分别转换成单个数字的数组,保存到m1 m2
{
int k=0,p=0;
p=strlen(str1)-1;
while(p>=0) //转换第一个大整数
{
if(*(str1+p)>'9' || *(str1+p)<'0') {cout<<"输入的数字不合法,失败!"< m1[k]=*(str1+p)-'0';
k++;
p--;
}
k=0;p=0;
p=strlen(str2)-1;
while(p>=0)
{
if(*(str2+p)>'9' || *(str2+p)<'0') {cout<<"输入的数字不合法,失败!"< m2[k]=*(str2+p)-'0';
k++;
p--;
}
}

int Add(int *m1,int *m2,int n1,int n2)//单个整数的相加方法
{
int i,tmp,ws,k=0,jw=0;
int math[MAX]={0},*p=math;
int math1[MAX]={0},math2[MAX]={0};
memcpy(math1,m1,sizeof(int)*n1);
memcpy(math2,m2,sizeof(int)*n2);
for(i=0;i {
tmp=math1[i];
math1[i]=math1[n1-i-1];
math1[n1-i-1]=tmp;
}
for(i=0;i {
tmp=math2[i];
math2[i]=math2[n2-i-1];
math2[n2-i-1]=tmp;
}
if(n1>n2) ws=n1;
else ws=n2;
while(k {
math1[k]=math1[k]+math2[k]+jw;
if(math1[k]>9) {math1[k]=math1[k]%10;jw=1;}
else jw=0;
k++;
}
if(jw==1) {math1[k]=1;k++;}
for(i=0;i {
tmp=math1[i];
math1[i]=math1[k-i-1];
math1[k-i-1]=tmp;
}
for(i=0;i {
printf("\n-----%d ",math1[i]);
}
printf("--------\n");
return(k);
}

void IntToStr(int x,char *ptr) //long int型转成char型
{
char str[MAX]={'\0'},*p=str,tmp;
int i,n;
i=0;
for(n=x;n!=0;n=n/10) //这样的结果是个位在前
{
if((tmp=n%10+'0')>'9' || tmp<'0') {cout<<"整数载入错误"< str[i]=tmp;
i++;
}
n=strlen(str);
for(i=0;i {
tmp=str[i];
str[i]=str[n-i-1];
str[n-i-1]=tmp;
}
strcpy(ptr,p);
return;

}

char *ArrayToStr(int m[MAX],int n) //整数的单个数集转换成字符串
{
char str[MAX]={'\0'},*p=str,tmp;
for(int i=0;i {
if((tmp=m[i]+'0')>'9' || tmp<'0') {cout<<"整数载入错误"< str[i]=tmp;
}
return(p);
}

int StrToArray(char *str,int *math) //返回这个整数的数位长度
{
int p,k;
p=strlen(str)-1; //字符串长度
k=0; //整数位数
printf("字符串是%s\n",str);
while(k<=p) //转换大整数
{
if(*str>'9' || *str<'0') {printf("输入的数字不合法,失败!(%d)\n",*str);exit(0);}
math[k]=*str-'0';
k++;
str++;

}
return(k);
}

char *Mult(char *str1,char *str2)
//任意整数字符串相乘,返回结果字符串
{
int i,j,k,w1,w2;
int den=1; //计算结果的符号问题
char str[MAX]={'\0'},*p=str,*x="0";
char f[MAX]={'\0'},*f1=f; //中间保存变量
char txt[MAX]={'\0'},*text=txt; //结果变量
char *s1=str1,*s2=str2,sss1[MAX]={'\0'},sss2[MAX]={'\0'};
int math1[MAX]={0},math2[MAX]={0};
if(*str1=='-') {den=den*(-1);s1=str1+1;} //判断符号
if(*str2=='-') {den=den*(-1);s2=str2+1;}

Diversion(s1,s2,math1,math2); //把字符串转换成单个数字数组
w1=strlen(s1);
w2=strlen(s2);
for(i=0;i {
for(j=0;j {
k=i+j;
//printf("%d*%d\n",math1[i],math2[j]);测试用
IntToStr(math1[i]*math2[j],p);//把本次计算值转换成字符串
while(k>0)//根据相乘的两个数字所在的位数,后面添加相应位个0
{
strcat(p,x);
k--;
}
//printf("本次计算之前f1 %s\n",f1);测试用
text=Add(f1,p); //把这个数与结果相加并保存到text字符串
strcpy(f1,text); //这次的结果拷贝又给f1,以便下次使用Add方法
//printf("本次计算结果%s\n",f1);测试用
}
}
if(strlen(text)==0) text[0]='0';//哈哈,万一计算结果是'\0',我们就给他一个0
else if(den==-1) //如果结果是负号 处理:将所有字符向后移一位,前面加'-'
{
i=strlen(text);

while(i)
{
*(text+i)=*(text+i-1);
i--;
}
*text='-';
}
return(text);//返回
}
};
-----------------------------------
//user.cpp-----main()文件

#include "BigCount.h"
main()
{
int t;
BigCount temp;
char str1[1000],*p1=str1,str2[1000],*p2=str2;
char ok[1000],*asp=ok;
cout<<"输入一个数字,任意大:"< cin>>t;
temp.IntToStr(1,p1);
for(int i=1;i<=t;i++)
{
temp.IntToStr(i,p2);

p1=temp.Mult(p1,p2);
}
printf("%s\n",p1);

}
注意:当输入的数字过大,计算时间会很久 222!使用3秒
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯