我爱打码


私信TA

用户名:ahahadu

访问量:4108

签 名:

等  级
排  名 9830
经  验 1129
参赛次数 1
文章发表 5
年  龄 0
在职情况 学生
学  校 东莞理工学院
专  业

  自我简介:

解题思路:
    我是一个初学者,只学到数组,所以用了数组的知识。

    就是,用数组储存。个位存在数组最后(因为这个结果会一直在增大,你根本不知道会达到多少位)。然后,思想就是,像我们在草稿纸上用乘法竖式算乘法一个样子。比如乘以3,被乘数每一个数字都要与3相乘(从个位开始嘛),然后,超过9要进啊,(比如27,就要进2;18就要进1),然后,我用了digit[]数组来储存要进的数。


    至于我里面的5660这些数怎么来。我是先给a[]数组弄一个很长的长度,比如10000、6000;但是我们输出,前面不能有多余的0 啊,所以,输出1977的阶乘后,我就缩小数组的长度,直到前面没有多余的0.

注意事项:

     这个结果位数高达5千多位。

要注意数组的长度,不要溢出了,注意储存是的顺序(顺序还是倒序)。

注意,digit[]的长度比a[]的长度大一位。是为了在写循环体时个位和其他位(如百位,千位)一致。

1和任何数相乘均为数本身,故不做乘1运算无所谓。


参考代码:


#include<stdio.h>

int main()

{

int a[5660],i,j,digit[5661];

for(i=0;i<5659;i++)a[i]=0;

for(a[5659]=1,i=2;i<=1977;i++)

{

for(j=5659,digit[5660]=0;j>=0;j-- )

{

a[j]=a[j]*i+digit[j+1];

digit[j]=a[j]/10;

a[j]=a[j]%10;

}


}

for(i=0;i<=5659;i++) printf("%d",a[i]);

printf("\n");



return 0;

}


 

0.0分

0 人评分

  评论区

你那个digit数组根本不用开的,一个整形变量就可以了
2018-03-05 10:20:56
嗯……可以这么说……在过程中算出了一共多少位后,可以把数组的长度缩短到刚刚好的这个长度
2017-12-14 00:41:43
这代码是编代码过程中算出5660的然后省略了求5660的过程吗
2017-12-13 19:30:24
  • «
  • 1
  • »