⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jiechen.cpp

📁 用链表实现的大数阶乘
💻 CPP
字号:
#include "stdafx.h"
#include ".\jiechen.h"
#include <iostream>
#include <string>
using namespace std;
//#using <mscorlib.dll>

//using namespace System;


jiecheng::jiecheng(int number)
{
	num=number;
	data=new bit[500];
	data->dangqianwei=1;
	data->jinwei=0;
	currentlen=500;
	for(int i=1;i<currentlen;i++)
	{
		(data+i)->dangqianwei=0;
		(data+i)->jinwei=0;
	}
	next=0;
	weishu=0;
	this->str="";
}

jiecheng::~jiecheng(void)
{
	delete []data;
}

int jiecheng::inflate()
{
	bit *d=new bit[currentlen+500];
	if(d==0)
	{
		cerr<<"Alloction Error"<<endl;
		exit(0);
	}
	for(int i=0;i<=next;i++)
	{
		d[i].dangqianwei=(data+i)->dangqianwei;
		d[i].jinwei=(data+i)->jinwei;
	}
	for(int i=next+1;i<currentlen+500;i++)
	{
		d[i].dangqianwei=0;
		d[i].jinwei=0;
	}
	currentlen+=500;
	delete []data;
	this->data = d;
	return 1;
}
void jiecheng::chen(int n){
		int zj=(data->dangqianwei)*n;
		(data)->jinwei=zj/1000;//changed
		(data)->dangqianwei=zj-data->jinwei*1000;//changed
		for(int i=1;i<=next;i++)
		{
			int k=( (data+i)->dangqianwei )*n+(data+i-1)->jinwei;
			//if( next>=currentlen-1)
			//	inflate(500ement);
			(data+i)->jinwei=k/1000;//changed
			(data+i)->dangqianwei= k -1000*(data+i)->jinwei;//changed
		}
		zj=(data+next)->jinwei;
		while(zj>0)
		{			
			if(next>=currentlen-1)
			{
				this->inflate(500);
			}
			next++;
			(data+next)->dangqianwei=zj-(zj/1000)*1000;	//changed
			zj=zj/1000;//changed
		}
}

void jiecheng::start()
{
	if(num!=0){
		for(int i=1;i<=num;i++)
		{
			chen(i);
		}
	}
	int shouwei=(data+next)->getd();
	if(shouwei/100)
		weishu=3*(next+1);
	else if(shouwei/10)
		weishu=3*next+2;
	else
		weishu=3*next+1;
}

System::String __gc* jiecheng::tostring()
{
	int k;
	for(k=0;k<=next;k++)
		if(this->data[k].getd()!=0)
			break;
	if(next<10)
	{
		int shouwei=(data+next)->dangqianwei;
		if(this->weishu%3==0)			//changed
		{	
			char buffer;
			sprintf(&buffer,"%d",shouwei/100);
			*str=*str+ buffer;
			*str=*str+".";
			if((shouwei-100* (shouwei/100) )/10==0)
			{
				*str=*str+'0';
				char buffer;
				sprintf(&buffer,"%d",shouwei%10);
				*str=*str+buffer;
			}
			else{
				char buffer[2];
				sprintf(buffer,"%d",shouwei%100);
				*str=*str+buffer;
			}
		}
		else if(weishu%3==2)
			{
				char buffer;
				sprintf(&buffer,"%d",shouwei/10);
				*str=*str+buffer;
				*str=*str+".";
				if(shouwei%10==0)//可简
					*str=*str+"0";
				else
				{
					sprintf(&buffer,"%d",shouwei%10);
					*str=*str+buffer;
				}
			}
			else
			{
				char buffer;
				sprintf(&buffer,"%d",shouwei);
				*str=*str+buffer;
				*str=*str+".";
			}
			for(int i=next-1;i>=k;i--)
			{
				if(data[i].getd()/10==0)
				{
					*str=*str+"00";
					char buffer;
					sprintf(&buffer,"%d",data[i].dangqianwei);
					*str=*str+buffer;
				}
				else if(data[i].getd()/100==0)
				{
					*str=*str+"0";
					char buffer[2];
					sprintf(buffer,"%d",data[i].dangqianwei);
					*str=*str+buffer;
				}
				else{
					char buffer[3];
					sprintf(buffer,"%d",data[i].dangqianwei);
                    *str=*str+buffer ;
				}
			}
			*str=*str+"e+";
			char b[10];
			sprintf(b,"%d",weishu-1);
			*str=*str+b;
		}
	else{
			//处理科学计数时的四舍五入问题
			if( (data[next-11].getd()/100 )>=5)//changed
			{
				data[next-11].setj(1);
				for(int i=next-10;i<=next&&data[i-1].getj()>0;i++)
				{
					data[i].setj( (data[i].dangqianwei+ data[i-1].jinwei )/1000 ); //changed
					data[i].setd( (data[i].dangqianwei+ data[i-1].jinwei) %1000 );
				}
			}
			int shouwei=(data+next)->dangqianwei;
			if(shouwei/100)
			{//changed
				char buffer;
				sprintf(&buffer,"%d",shouwei/100);
				*str=*str+buffer;
				*str=*str+".";
				if( (shouwei-100* (shouwei/100) )/10==0)
				{
					*str=*str+"0";
					char buffer;
					sprintf(&buffer,"%d",shouwei%10);
					*str=*str+buffer;;
				}
				else
				{
					char buffer[2];
					sprintf(buffer,"%d",shouwei%100);
					*str=*str+buffer;
				}
			}
			else if(shouwei/10)
			{
				char buffer;
				sprintf(&buffer,"%d",shouwei/10);
				*str=*str+buffer;
				*str=*str+".";
				if(shouwei%10==0)
					*str=*str+"0";
				else
				{
					char buffer;
					sprintf(&buffer,"%d",shouwei%10);
					*str=*str+buffer;
				}
			}
			else
			{
				char buffer;
				sprintf(&buffer,"%d",shouwei);
				*str=*str+buffer;
				*str=*str+".";
			}
			for(int i=next-1;i>next-11&&i>=k;i--)
			{
				if(data[i].getd()/10==0)
				{
					*str=*str+"00";
					char buffer;
					sprintf(&buffer,"%d",data[i].dangqianwei);
					*str=*str+buffer;
				}
				else if(data[i].getd()/100==0)
				{
					*str=*str+"0";
					char buffer[2];
					sprintf(buffer,"%d",data[i].dangqianwei);
					*str=*str+buffer;
				}
				else{
					char buffer[3];
					sprintf(buffer,"%d",data[i].dangqianwei);
                    *str=*str+buffer ;
				}
			}
			*str=*str+"e+";
			char b[10];
			sprintf(b,"%d",weishu-1);
			*str=*str+b;
		}
	return *str;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -