计算大树阶乘,计算十万的阶乘需要5分钟(CPU2.4)

void initial()初始化数组和输入数,

void multi()进行一次中间结果和整型相乘,放入结果数组,

void copynum()把结果数组放入中间结果数组,结果数组清零,

void  clearmax()设置每次该循环的次数,使得程序不空循环,

void output()输出结果.

 

PS:现在计算速度还不是很好,如果对于大于十万的需要采用中间结果文本记录或者数组保存,

那样对于百万以上的计算才可行.

 

#include <direct.h>
#include <iostream.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <time.h>
#include <fstream.h>

int max=100;
int des[1000000];
int temp[1000000];
int innum=100;
int increaseleap=5;
void output();

void initial()
{
 for(int i=0;i<100000;i++)
 {
  des[i]=0;
  temp[i]=0;
 }
 i=0;
 increaseleap=1;
 while(innum)
 {
  temp[i]=(int)innum%100;
  innum=(int)innum/100;
  i++;
  increaseleap++;
 }
 cout<<"initial:"<<endl;
 bool flag=false;
   for(i=max;i>=0;i--)
   {
    if(temp[i]!=0) flag=true;
    if(flag)
     cout<<temp[i];
   }
  cout<<endl<<"initial end"<<endl;
}

inline void multi()
{
 int add=0;
 double total=0;
 max+=increaseleap;
    for(int i=0;i<max;i++)
 {
       total=temp[i]*innum+add;
    des[i]+=(int)total%100;
    add=(int)total/100;
    //if(add>100)
     //cout<<"=========================wrong"<<endl;
 }
 if(des[max]>0)
 {
  cout<<"计算溢出,答案错误!!!!!!"<<endl;
     getchar();
  exit(0);
 }
}

void clearmax()
{

 cout<<"old max: "<<max<<endl;
 for(int i=max;i>=0;i--)
 {
  if(temp[i]!=0)
  {
   max=i+10;
   break;
  }
 }
 cout<<"new max: "<<max<<endl;
 //getchar();
}

inline void copynum()
{
 for(int i=0;i<max;i++)
 {
  temp[i]=des[i];
  des[i]=0;
 }
}

void output()
{
   bool flag=false;
   int k=1;
   fstream fp;
   fp.open("1.txt",ios::out);
   cout<<"result:"<<endl;
   for(int i=max;i>=0;i--)
   {
    if(temp[i]!=0)flag=true;
    if(flag)
    {
     if(temp[i]<10)
    {
      cout.width(1);
      cout<<"0"<<temp[i]<<"/t";
      fp.width(1);
      fp<<"0"<<temp[i]<<"/t";
     }
    else
     {
       cout.width(2);
    cout<<temp[i]<<"/t";
    fp.width(2);
    fp<<temp[i]<<"/t";
     }  
    if(k%20==0)
      fp<<endl;
    k++;
    }
    //if(i%10==0)
    if(flag&&(i%500==0))
    {
    // getchar();
        cout<<endl;
    }
   }
   cout<<endl<<"total line number= "<<k<<endl;
   cout<<"/noutput end"<<endl;
   fp.close();
}

void main()
{
 clock_t t1,t2; 
 cout<<"输入innum:"<<endl;
 cin>>innum;
 int i=innum;
 int steppercent=i/100;
 int timepercent=0;
 int percent=1;
 cout<<endl<<"输入数字是"<<innum<<endl;
 initial();
 t1=clock();
 t2=clock();
 while(i>1)
 {
  i--;
  innum=i;
  multi();
  copynum();
  timepercent++;//输出进度
  if(timepercent>steppercent)
  {
   cout<<percent++<<"%"<<endl;
   cout<<"Runing time: "<<clock()-t2<<endl;
   t2=clock();
   timepercent=0;
   clearmax();
  }
  
 }
 cout<<"Runing time= "<<clock()-t1<<endl;
 t1=clock();
 output();
    cout<<"Out put time= "<<clock()-t1<<endl;
 cout<<"max=  "<<max<<endl;
 getchar();
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值