c晨光


私信TA

用户名:H1320312

访问量:13130

签 名:

大佬们带带我,学渣+oo,哎,我好笨,我为什么这么笨

等  级
排  名 647
经  验 3907
参赛次数 0
文章发表 23
年  龄 10
在职情况 学生
学  校 HBWLXY
专  业 学生

  自我简介:

生活当然需要多姿多彩,不过哪有刷题精彩呢,哇咔咔

解题思路:
定义一个数组,存储每个位上的数

如a[0]代表个位上的数

a[1]代表十位上的数,接下来同理


Js函数是对阶乘进行计算并把计算结果存储到数组中去

现在对js数组进行讲解


1》外部的for循环显然是用于控制阶乘的,循环一次乘以一个数


2》第一个while用于控制i乘到最高位,如5!=120,i=6的时候,i只需要乘到1就好了,1就是120的最高位,初始化的数组的数据是-1,最高位的后面就是数据为-1的数了,这里乘好了之后每数组中的数是可以大于10的,下面的for循环就是用来进位的


3》内部的for循环,用于进位,每个位上的数一旦大于10就进位,进到最高位就停止,显然我写的最高位就是p-1位,但是为什么j到j<p-1的时候就停止呢?,因为j=p-2位时,j位上的数据存到j+1位上了,即p-1位上,最高位我们是要特殊处理的,最高位的后一位是小于0的数,进位的话很不方便


4》因此第二个while就是对最高位进行处理的,若最高位的数大于10,就进位到更高的位上,特殊地方特殊处理,当无法再满足进位的条件了,就停止进位,结束while循环。


进行下一次的外部的for循环,乘以下一个i

注意事项:
不管是个位、十位、千位和p位上的数,都是小于10的,且不小于0的数。故初始化的时候所有数都是-1


输出的时候从最高位进行输出,个位是放在最右边的,别输反了,,,

参考代码:

#include <iostream>
#include <string.h>
int a[5000];
using namespace std;
int js(int a[],int n)
{
a[0]=1;int len;
for(int i=1;i<=n;i++){
int p=0;
while(a[p]!=-1){
a[p]*=i;
p++;
} 
for(int j=0;j<p-1;j++){
if(a[j]>9)
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
while(a[p-1]>9){ 
a[p]=a[p-1]/10;
a[p-1]=a[p-1]%10;
p++;
}
len=p;
}
return len-1;
}
int main(int argc, char *argv[])
{
int n;
cin>>n;
memset(a,-1,sizeof(a));//初始化,很好用的
a[0]=1;
if(n==0)
cout<<1<<endl;
for(int i=js(a,n);i>=0;i--)
cout<<a[i];
cout<<endl; 
return 0;
}

数组可以存每个位的数,当然字符串也可以,个人建议用string型的字符串,好操作一些,在这里提供一个思考方法,本人的文章中有大数据的加法运算,用到的是字符串,有兴趣的话记得看一下,记得点赞和优化哦,谢谢

 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

666
2018-12-09 18:45:42
进位和处理最高位看得我有点脑阔疼,可能理解能力实在不行。
2018-12-09 18:45:26
  • «
  • 1
  • »