编写一个程序,可以求一个大数n的阶乘(n!),n的值范围从1—100之间的变化。

作者&投稿:实居 (若有异议请与网页底部的电邮联系)
求大数阶乘的经典算法早就有了,下面是按你要求改动过的,希望对你有帮助:
#include <stdio.h>
int main()
{
int n;
int k;
int a[9000]; //确保保存最终运算结果的数组足够大
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
int i,j,carry; //进位

printf("please in put n:\n");
scanf("%d",&n);
a[0] = 1; //将结果先初始化为1

for(i = 2; i <= n; i++) { //开始阶乘,阶乘元素从2开始依次"登场"
//按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j = 1, carry = 0; j <= digit; j++) { //carry:进位
temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位//相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry) { //如果有进位
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry = carry/10; //看还能不能进位
}
}
printf("n ! = "); //显示结果
k=0;
for(j = digit; j >=1;j--) {
if k=3
{
printf(",");
k=0;
}
else
k++;
printf("%d",a[j-1]);
}
printf("\n");
return 0;
}

#include<stdio.h>

#include<string.h>

//字符串反转函数,
void fanzhuan(char *s)
{
char temp;
for(char *end=s+strlen(s)-1;end>s;--end,++s)//通过控制字符指针,两边向中间缩进,就是说 头和尾 进行对调
{
temp=*s;
*s=*end;
*end=temp;
}
}

int main()
{
int n;//所求n
int i,j,k;
int carry; //进位
int str[9000]; //确保保存最终运算结果的数组足够大
char str2[9000],str3[9000];//两个字符数组,用来存储 整形数据 转化而成的 字符数据
int digit = 1; //位数,初始化为1
int temp; //阶乘的任一元素与临时结果的某位的乘积结果

printf("please in put n:\n");
scanf("%d",&n);
str[0] = 1; //将结果先初始化为1

//计算结果是反序的
for(i = 2; i <= n; i++)
{
//按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j = 1, carry = 0; j <= digit; j++)
{
//carry:进位
temp = str[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位//相乘(加上进位)

str[j-1] = temp % 10; //更新临时结果的位上信息

carry = temp / 10; //看是否有进位
}

//如果有进位
while(carry)
{

str[++digit-1] = carry % 10; //新加一位,添加信息。位数增1

carry = carry/10; //看还能不能进位
}
}

//将整形数组转换成字符数组,此时的整形数组的 存储的n!的逆序数,如4!=24,但整形数组存储的形式是 4,2
for(i=0;i<digit;i++)
{
str2[i]=str[i]+'0';
}

str2[i]='\0';

//每隔四位添加一个逗号,k就是控制这样一个循环的变量其取值1—5
for(i=0,j=0,k=1;i<strlen(str2);i++,j++,k++)
{
if(k==5)//当k为5时,添加逗号,不进行拷贝
{
str3[j]=',';
i--;//因为当执行这边是,不进行拷贝,但i++后,就漏了一位,故先i--,在i++,保持i的不变
k=0;//新的一轮开始,k=0
continue;
}
//不是5时,拷贝
str3[j]=str2[i];
}
str3[j]='\0';//不要忘了,最后的'\0';

//调用 字符串反转函数,是的顺序 调转过来
fanzhuan(str3);

//输出字符串中存储的字符,也就是整形数据
printf("%s",str3);

return 0;
}
//我看了 第二个回答后,试了一遍,我修改了下

标记一下,大叔结成,貌似很烦的,坐等高手

跟我想提的一样

编写一个程序,可以求一个大数n的阶乘(n!),n的值范围从1~100之间变化。 100财富值求精品。~

#include

#include

//字符串反转函数,
void fanzhuan(char *s)
{
char temp;
for(char *end=s+strlen(s)-1;end>s;--end,++s)//通过控制字符指针,两边向中间缩进,就是说 头和尾 进行对调
{
temp=*s;
*s=*end;
*end=temp;
}
}

int main()
{
int n;//所求n
int i,j,k;
int carry; //进位
int str[9000]; //确保保存最终运算结果的数组足够大
char str2[9000],str3[9000];//两个字符数组,用来存储 整形数据 转化而成的 字符数据
int digit = 1; //位数,初始化为1
int temp; //阶乘的任一元素与临时结果的某位的乘积结果


printf("please in put n:
");
scanf("%d",&n);
str[0] = 1; //将结果先初始化为1


//计算结果是反序的
for(i = 2; i <= n; i++)
{
//按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j = 1, carry = 0; j <= digit; j++)
{
//carry:进位
temp = str[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位//相乘(加上进位)

str[j-1] = temp % 10; //更新临时结果的位上信息

carry = temp / 10; //看是否有进位
}

//如果有进位
while(carry)
{

str[++digit-1] = carry % 10; //新加一位,添加信息。位数增1

carry = carry/10; //看还能不能进位
}
}


//将整形数组转换成字符数组,此时的整形数组的 存储的n!的逆序数,如4!=24,但整形数组存储的形式是 4,2
for(i=0;i<digit;i++)
{
str2[i]=str[i]+'0';
}

str2[i]='\0';


//每隔四位添加一个逗号,k就是控制这样一个循环的变量其取值1—5
for(i=0,j=0,k=1;i<strlen(str2);i++,j++,k++)
{
if(k==5)//当k为5时,添加逗号,不进行拷贝
{
str3[j]=',';
i--;//因为当执行这边是,不进行拷贝,但i++后,就漏了一位,故先i--,在i++,保持i的不变
k=0;//新的一轮开始,k=0
continue;
}
//不是5时,拷贝
str3[j]=str2[i];
}
str3[j]='\0';//不要忘了,最后的'\0';


//调用 字符串反转函数,是的顺序 调转过来
fanzhuan(str3);


//输出字符串中存储的字符,也就是整形数据
printf("%s",str3);


return 0;
}
// 看这个有帮助吗?流程图那些的话,根据程序就自然画出来了


逻辑上说这里应该是Data[j] >= 10,可能是笔误写成了>。但这又不影响结果,为什么呢?
因为不论N取什么值,都没有Data[j]=10的情况(我是说运行到if(Data[j]>10)的时候不会有)。其实只要自己算几遍就知道了,最有可能出现10的是N=5,循环到i=5时,data[1]=4,data[2]=2,接着data[1]乘五变成20,data[2]变成10(好像变成10了哦),但执行if(Data[j]>10)时,data[1]先判,此时data[1]变成0,data[2]变成了12(与10擦肩而过)。。。。
当i>10时,不用讨论了,Data[j]*i要么比十大,要么比十小了。

总结下,这个算法写的真一般。。。。

编写一个应用程序,求满足1+2!+3!+……+你!<=9876的最大数n
答:不知道你学到自定义函数了没有~定义一个函数用来求 n!,该函数包含一个for 1..n 的循环 然后在写一个循环,从1!加起,加完判断下是否大于 9876,如果大于就退出循环。循环里面把n存到一个变量里面,最后打印n就行了 我没学过 Java,所以不会写。你刚入门一定要试着自己写程序,写着写着就...

用c语言实现,求n!当n大于100时也可求.
答:int n=getN();int size=getBitNum(n);cout<<size<<endl;char *pa=init(size);calc(pa,n);display(pa,size);delete []pa;} int getN(){ int n;do{ cout<<"输入一个数";cout<<"n=";cin>>n;}while(n<0);return n;} int getBitNum(int n){ doub...

C语言求N个数的最大值,递归算法
答:include<stdio.h> int max(int n,int numbers[],int index){ if(index<(n-1)){ if(numbers[index]>numbers[index+1])numbers[index+1]=numbers[index]; //没到最后位则把大数放后面 index++;return max(n,numbers,index);} else if(index==(n-1)){ return numbers[index]; //到...

C# 输入n个数,求最大的数。用for语句循环写
答:{ int n; //n个数 double max;//最大数 double[] arr;n = int.Parse (Console.ReadLine ()); //输入n arr = new double[n];//输入n个数 for (int i = 0; i < n; i++){ arr [i] = double.Parse (Console.ReadLine ());} max = arr [0]; //假设第一个最大,接...

c++编程题:编写一个函数求n个整数中的最大数和最小数。分别使用指针类型...
答:{ max=*min=v[0];for(int i=1;i<length;i++){ if(v[i]>*max) *max=v[i];if(v[i]<*min) *min=v[i];} } void main(){ int v[10]={1,2,5,45,788,5,8,9,5,46};int max,min;MaxAndMin(v,10,&max,&min);cout<<max<<'\t'<<min<<'\n';} 以上是指针形式...

有一个用链表求大数N的阶成的问题,帮我详细解释一下。急啊~
答:程序我看过了,我理解它的算法原理应该是:1).链表中每一个节点只能表示0~9之间的数,表示阶乘结果中的一位,如果阶乘结果有n位数,那么链表就有n个节点,并且顺序是由低位到高位保存的,所以需要逆序输出链表.2).每次乘一个新的数后需要对链表中每个节点作取余和进位操作,例如:要计算5的阶乘,那么应该...

c语言 如何求n个数的最大值 最小值
答:不要使用数组,手动分配内存,申请内存的长度由用户输入,最后释放内存就行了 相关代码:include <stdio.h>#include <stdlib.h>void main(){ int *a, n, max, min, i; scanf("%d", &n); a = (int *)calloc(1, n * sizeof(int)); if(a == NULL) { printf("...

输入n个整数,求出其中最大数及其所在位置,以及此n个数中的个数!用C...
答:n的数目是否已知?/*代码参考*/ include <iostream>#include <algorithm>using namespace std;int main(){ int i; cout<<"请输入元素的个数:"; cin>>i; int pos; int pre_num[i+5]; int save_num[i+5]; while(i--) { cin>>pre_num[i-1]; save...

(C语言)输入一个正整数n, 再输入n 个整数,输出这n个整数的最大值.
答:include intmain(){ intn,a,i,t;scanf("%d",&n);if(n<=0){ printf("输入n的值错误");return0;} scanf("%d",&t);//先读的第一个数要默认成最大的,不然,t的初值是不定的 for(i=1;i{ scanf("%d",&a);if(t} printf("%d",t);return0;// } ...

已知s=1+2+3...+N ,找出一个最大数N,使得s<3000 ,编写程序解决此问题...
答:void main(){ int s=0;int n=0;while(s<3000){ n++;s+=n;} printf("n=%d",n);} 所以主体结构是循环结构,选择只一次,循环了很多次