鱼C论坛

 找回密码
 立即注册
查看: 4131|回复: 11

求阶乘优化算法 鄙人想不到·····

[复制链接]
发表于 2012-3-22 16:47:06 | 显示全部楼层 |阅读模式
1鱼币
阶乘的递归算法慢了,求个优化的算法···我试了几种方法(不能称之为算法)都不能满足要求;
各位大侠顺便说说阶乘优化算法的原理哦·······

最佳答案

查看完整内容

估计楼主应该是在算一个大数,如果楼主了解汇编就,会发现,经过多次乘法运算后,由于数据的长度越来越大,数据的存取会越来越慢,一开始我也没有思考楼主所谓的递归优化,但是看了前面几位的回复,楼主居然还对时间有限制,我就想到应该是在算一个大数 定义一个整型的数组,每一位不是存放一位而是存放五位,这样相加,相乘的次数就是原来的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-22 16:47:07 | 显示全部楼层
本帖最后由 wAterLoo 于 2012-3-22 18:10 编辑

估计楼主应该是在算一个大数,如果楼主了解汇编就,会发现,经过多次乘法运算后,由于数据的长度越来越大,数据的存取会越来越慢,一开始我也没有思考楼主所谓的递归优化,但是看了前面几位的回复,楼主居然还对时间有限制,我就想到应该是在算一个大数
定义一个整型的数组,每一位不是存放一位而是存放五位,这样相加,相乘的次数就是原来的
  1. #include<stdio.h>



  2. int main()  

  3. {   

  4.      int n;

  5.      printf("请输入一个整数N(0~20000):\n");   

  6.      while(scanf("%d", &n) != EOF){      

  7.          int s[16000] = {0}, j, i, k = 0, t = 0, p = 0;
  8.          long sum = 0;        

  9.          s[0] = 1;  

  10.          for(j = 1;j <= n;j++){  
  11.               for(i = 0;i <= t;i++){  
  12.                    sum = s[i] * j + p;  
  13.                    p = 0;  
  14.                    if(sum > 99999){  
  15.                        s[i] = sum % 100000;   //每一位存放位         
  16.                        p = sum / 100000;         
  17.                        if(t == i){
  18.                             t++;
  19.                             s[t] = 0;
  20.                        }  
  21.                    }  
  22.                    else s[i]=sum;  
  23.               }  
  24.          }  

  25.          printf("%d!=", n);
  26.          printf("%d", s[t]);  
  27.          for(i = t - 1;i >= 0;i--){   
  28.               printf("%05d",s[i]);  
  29.          }  

  30.          printf("\n\n");

  31.          printf("请再输入一个整数N(0~20000):\n");

  32.      }  

  33.      return 0;  

  34. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-22 17:15:26 | 显示全部楼层
多优化算优化
  1. #include<stdio.h>
  2. void main()
  3. {
  4. int qjc(int x);
  5. int a,b;
  6. printf("请输入欲求阶乘的数字!\n");
  7. scanf("%d",&a);
  8. b=qjc(a);
  9. printf("阶乘的数字=%d\n",b);
  10. }
  11. int qjc(int x)
  12. {
  13. int a,q=1;
  14. for(a=1;a<=x;a++)
  15. {
  16. q*=a;
  17. }
  18. return  (q);
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-22 17:17:20 | 显示全部楼层
迭代啊。

int a = 1, n;
cin >> n;
for ( ; n > 0 ; n-- )
{
     a = n * a;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-22 17:22:35 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-22 19:10:00 | 显示全部楼层
wAterLoo 发表于 2012-3-22 16:47
估计楼主应该是在算一个大数,如果楼主了解汇编就,会发现,经过多次乘法运算后,由于数据的长度越来越大, ...

谢谢了,没有想到这个方面的事情,受教了·····
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-23 20:34:59 | 显示全部楼层
给你个程序自己看下吧
这个应该速度还行的
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>

  5. #define MAX 100000

  6. int aryResult[MAX * 4];

  7. int main(void)
  8. {
  9.     /*nMulTemp(乘积临时变量), nCarry(保存进位信息)*/
  10.     int nNum, nMulTemp, nCarry, nIndex;
  11.     int i,j;
  12.     clock_t begin, end; /*计时*/
  13.     double  cost;
  14.     FILE *fp;
  15.    
  16.     printf("Input N Please!:");
  17.     scanf("%d", &nNum);
  18.    
  19.     aryResult[0] = 1; /*初始化结果数组*/
  20.     nIndex = 1;
  21.    
  22.     begin = clock(); /*计时开始*/
  23.    
  24.     for(i = 2; i <= nNum; i++)
  25.     {
  26.         nCarry = 0; /*进位信息清零*/
  27.         for(j = 0; j < nIndex; j++)
  28.         {
  29.             nMulTemp = aryResult[j] * i + nCarry; /*乘积 + 进位*/
  30.             aryResult[j] = nMulTemp % 100000;
  31.             nCarry = nMulTemp / 100000; /*计算进位*/
  32.         }
  33.         while(nCarry != 0) /*循环处理进位*/
  34.         {
  35.             aryResult[nIndex] = nCarry % 100000;
  36.             nCarry = nCarry / 100000;
  37.             nIndex++;
  38.         }
  39.     }
  40.     /*计算耗时*/
  41.     end = clock();
  42.     cost = (double)(end - begin) / CLOCKS_PER_SEC;
  43.     printf("%lf seconds\n", cost);
  44.    
  45.     system("pause");
  46.     /*输出计算结果到"output.txt*/
  47.     fp = fopen("output.txt", "w");
  48.     for(i = (nIndex - 1); i >= 0; i--)
  49.     {
  50.         fprintf(fp, "%05d", aryResult[i]);
  51.     }
  52.     fclose(fp);   
  53.     printf("Result Output To "output.txt"\r\n");
  54.     return 0;
  55. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-24 18:37:50 | 显示全部楼层
好样的 加油
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-26 02:37:57 | 显示全部楼层
大数迷茫啊~~~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-26 23:16:02 | 显示全部楼层
追忆_、流年 发表于 2012-3-24 18:37
好样的 加油

其实 路还很长的哦····
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-26 23:16:24 | 显示全部楼层
sc3297 发表于 2012-3-26 02:37
大数迷茫啊~~~~~~

对啊···对于数组的处理还真要多学了····
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-26 23:18:50 | 显示全部楼层
ccqiji 发表于 2012-3-23 20:34
给你个程序自己看下吧
这个应该速度还行的

学友高见!那个  我能不能请教一下 就是错过用数组储存了一个很大的数(比如位数有1000位)然后我要用这个数对某个数(比如说13)求余,该怎么控制进位啊,我想不到······
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-14 19:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表