亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dicorder.cpp

?? n個元素{1,2,…,n}有n!個不同的排列。將這n!個排列按字典序排列
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include "time.h"
#include "windows.h"
using namespace std;
int minlast,maxlast;
#ifndef BIG_INT
#define BIG_INT
#include "math.h"
#include <string>
#pragma warning(disable:4035)

typedef unsigned long DWORD;
typedef unsigned int UINT;
typedef unsigned char BYTE;
const DefaultLen = 1;
const MaxLen = 0x0100000;


class CBigInt
{
public:
	//構造及析構函數
	CBigInt();
	CBigInt(DWORD dwValue);
	CBigInt(char* pszVal);
	CBigInt(const CBigInt& x);	
	/*virtual*/ ~CBigInt();
public:
	//以下定義的是運算
	//重載的賦值運算符
	CBigInt& operator = (const CBigInt& x);
	CBigInt& operator = (char* pszVal);
	CBigInt& operator = (DWORD dwValue);

	//重載的加法運算符
	CBigInt& operator += (CBigInt& x);
	CBigInt& operator += (DWORD dwValue);	
	CBigInt  operator + (CBigInt& x);
	CBigInt  operator + (DWORD dwValue);
	CBigInt  operator ++();			//++a
	CBigInt  operator ++(int);		//a++
	
	//重載的減法運算符,因為是無符號數,所以結果為大數減小數得到的差
	CBigInt& operator -= (CBigInt& x);
	CBigInt& operator -= (DWORD dwValue);
	CBigInt operator - (CBigInt& x);
	CBigInt operator - (DWORD dwValue);

	CBigInt&  operator --();			//--a
	CBigInt  operator --(int);		//a--

	//重載的乘法運算符
	CBigInt& operator *= (DWORD dwValue);
	CBigInt& operator *= (CBigInt& x);
	CBigInt  operator * (DWORD dwValue);
	CBigInt  operator * (CBigInt& x);

	//重載的除法運算符
	DWORD operator /= (DWORD dwValue); //返回余數
	CBigInt operator /= (CBigInt& x);//返回余數
	CBigInt operator / (DWORD dwValue); //返回商
	CBigInt operator / (CBigInt& x);//返回商

	CBigInt operator % (CBigInt& x);
	DWORD operator % (DWORD dwValue);

	//重載的比較運算符
	bool operator == (const CBigInt& x);
	bool operator == (DWORD dwValue);
	bool operator != (const CBigInt& x);
	bool operator != (DWORD dwValue);
	bool operator > (const CBigInt& x);
	bool operator > (DWORD dwValue);
	bool operator >= (const CBigInt& x);
	bool operator >= (DWORD dwValue);
	bool operator < (const CBigInt& x);
	bool operator < (DWORD dwValue);
	bool operator <= (CBigInt& x);
	bool operator <= (DWORD dwValue);


	//乘2運算,即 	//  a =  a * 2^dwTimes; 相當于左移一位二進制,低位補0
	CBigInt& Double(DWORD dwTimes = 1);

	//除2運算; 相當于右移一位二進制,高位邊補0,低位舍棄
	CBigInt& Half(DWORD dwTimes = 1);
public:
	//以下定義的是常用的操作
	//重新分配內存空間,用于增加數據長度,n為新長度
	void Expand(DWORD n);

	//壓縮數據,以節省空間。指去掉高位多余的0。
	void Compress();	

	//轉換在十六進制數字符串
	void ToHexStr(std::string& s);
	std::string ToHexStr();
	
	//轉換成十進制數字符串
	void ToDecStr(std::string& s);
	std::string ToDecStr();
	unsigned long size(){return (this->ToDecStr()).size();}
protected:
	//輔助函數
	inline DWORD LeastOver(DWORD n) ;//查找一個比n大,且為2^x次方的數

protected:
	DWORD *pValue;		//指向一個DWORD數組,用于存放數值
	DWORD len;			//DWORD數組的長度
	DWORD last;			//數組中的有效長度
};

const My_ErrorNo_OverFlow = 0;
const My_ErrorNo_ZeroByDiv = 1;
class CMyException  
{
public:
	CMyException(char* msg, UINT uErrorNo);
	/*virtual*/ ~CMyException();
	char* m_szMsg;
	UINT  m_uErrorNo;
protected:
	CMyException(){}
};

void MemCpy(DWORD* dst, DWORD* src, DWORD n)
{
	__asm
	{
		mov ecx, n;
		jecxz to_end;	

		//保存方向標志
		pushf;	
		
		mov edi,dst;
		mov esi, src;
		cmp edi, esi;
		jbe to_up;	//dst <= src;
		
		mov eax, ecx;
		shl eax, 2;
		add eax, esi;
		cmp edi, eax;
		jae to_up;	//dst >= src+4n
		
		mov eax, ecx;
		dec eax;
		shl eax, 2;
		add edi, eax;
		add esi, eax;
		std;
		jmp to_mov;
to_up:
		cld;
to_mov:
		rep movsd;
		popf;
to_end:
	}
}

CBigInt::CBigInt()
{
	pValue = new DWORD[len = DefaultLen];
	*pValue = 0;
	last = 1;
}

CBigInt::~CBigInt()
{
	delete [] pValue;
}

CBigInt::CBigInt(const CBigInt &x)
{
	pValue = new DWORD[	len = x.len];
	memset(&pValue[x.last],0,(len-x.last)*4);
	MemCpy(pValue, x.pValue, last = x.last);
}

CBigInt::CBigInt(DWORD dwValue)
{
	pValue = new DWORD[	len = DefaultLen];		
	*pValue = dwValue;
	last = 1;
}

CBigInt::CBigInt(char* pszVal)
{
	len = DefaultLen;
	pValue = new DWORD[len];
	operator = (pszVal);	
}

void CBigInt::Expand(DWORD n)
{
	if (n > MaxLen)
	{
		CMyException* exception = new 
CMyException("超過規定能處理的最大整數", My_ErrorNo_OverFlow);
		throw exception;
	}
	if (n > len)
	{
		DWORD* pTemp = new DWORD [len = n];
		memset(&pTemp[last], 0, (n-last)*4);
        len = n;
		MemCpy(pTemp, pValue, last);
		delete [] pValue;
		pValue = pTemp;
	}
}

CBigInt& CBigInt::operator = (const CBigInt& x)
{
	if (this != &x)
	{
		if (len < x.last)
		{
			Expand(LeastOver(x.last));
		}
		MemCpy(pValue, x.pValue, last = x.last);
	}
	return *this;
}


CBigInt& CBigInt::operator = (DWORD dwValue)
{	
	*pValue = dwValue;
	last = 1;	
	return *this;
}

CBigInt& CBigInt::operator *= (DWORD dwValue)
{	
	if (dwValue == 0)
	{
		*pValue = 0;
		last = 1;	
	}
	else if (dwValue != 1)
	{
		DWORD times;
		__asm
		{
			bsr ebx, dwValue;
			bsf ecx, dwValue;
			cmp ebx, ecx;
			jne M0;				//如果是2的n次方,則使用移位的乘法
			mov times, ebx;
		}
		return Double(times);
		
M0:		
		DWORD dwFull;	
		__asm 
		{
			mov ebx, this;
			mov esi, [ebx]this.pValue;
			mov ecx, [ebx]this.last;
			mov ebx, dwValue;		//乘數
			xor edi, edi;			//作臨時存貯器,保存高位
L1:		
			mov eax, [esi];
			mul ebx;
			add eax, edi;
			mov [esi], eax;
			adc edx, 0;
			mov edi, edx;
			add esi, 4;
			loop L1;
			
			cmp edi, 0;
			je L2;
			mov dwFull, edi;
		}
		if (last == len)
		{
			Expand(LeastOver(last+1));			
		}
		pValue[last++] = dwFull;
	}
L2:
	return *this;
}


CBigInt& CBigInt::operator *= (CBigInt& x)
{
	CBigInt a(*this);   
	CBigInt result;	
	a.Expand(LeastOver(x.last + last));
	result.Expand(LeastOver(x.last + last));  
//不用this保存結果是因為考慮到x可能等于*this
	for (DWORD i=0; i<x.last; i++)
	{		
		result.operator += (a * x.pValue[i]);
		a.Double(16);
		a.Double(16);
	}	
	return *this = result;
}

CBigInt CBigInt::operator * (CBigInt& x)  
{
	CBigInt a(*this);
	return a *= x;
}

CBigInt CBigInt::operator * (DWORD dwValue) 
{
	CBigInt a(*this);
	return a *= dwValue;
}

CBigInt& CBigInt::operator += (DWORD dwValue)
{
	__asm
	{		
		mov ebx, this;
		mov edi, [ebx]this.pValue;
		mov ecx, [ebx]this.last;		
		
		mov eax, dwValue;
		add [edi], eax;
		jnc L3;		
		
		mov edx, 1;
		jmp L2;
L1:  		
		add dword ptr[edi][edx*4], 1;
		jnc L3;
		inc edx;
L2:		
		loop L1;
	}
	if (last == len)
	{
		Expand(LeastOver(len+1));			
	}
	pValue[last++] = 1;		
L3:
	return *this;
}

CBigInt& CBigInt::operator += (CBigInt& x)
{	
	Expand(x.len);
	if(last<x.last)
		last=x.last;
	__asm
	{
		mov ebx, this;
		mov edi, [ebx]this.pValue;
		mov edx, x;
		mov esi, [edx]x.pValue;
		mov ecx, [edx]x.last;	
		xor edx, edx;		
		clc;
L1:	
		mov eax, [esi][edx*4];
		adc [edi][edx*4], eax;
		inc edx;
		loop L1;		
		jnc L4;
		
		mov ecx, [ebx]this.last;		//如果this的有效位更長,則加進位
		mov ebx, x;		
		sub ecx, [ebx]x.last;
		jz  L3;		
L2:
		add [edi][edx*4], 1;
		jnc L4;
		inc edx;
		loop L2;		
	}
L3:	
	if (last == len)
	{
		Expand(LeastOver(len+1));			
	}
	pValue[last++] = 1;
L4:	
	return *this;
}

CBigInt CBigInt::operator + (DWORD dwValue) 
{
	CBigInt a(*this);
	return a += dwValue;
}

CBigInt CBigInt::operator + (CBigInt& x)
{
	CBigInt a(*this);
	return a += x;
}

CBigInt& CBigInt::Double(DWORD dwTimes /*= 1*/)
{	
	if (dwTimes % 32 != 0)
	{
		DWORD dwFull = 0;
		__asm 
		{
			mov ebx, this;		
			mov edi, [ebx]this.pValue;
			mov ebx, [ebx]this.last;
			xor eax, eax;
			mov ecx, dwTimes;
L1:
			mov edx, [edi];		
			shld [edi], eax, cl;		
			mov eax, edx;
			add edi, 4;
			dec ebx;
			jnz L1;
			
			neg cl;
			shr edx, cl;
			jz L2;
			mov dwFull, edx;
		}
		if (len == last)
		{
			Expand(LeastOver(last+1));
		}
		pValue[last++] = dwFull;
	}
L2:	
	DWORD dwStep = dwTimes >> 5;  //除以32
	while (dwStep > 0)
	{
		Expand(LeastOver(last+dwStep));
		MemCpy(&pValue[dwStep], pValue, last);
		last += dwStep;
		dwStep--;
	}	
	return *this;
}

void CBigInt::Compress()
{
	DWORD n = LeastOver(last);
	if (n < len)
	{
		DWORD *pTemp = new DWORD [len=n];
		MemCpy(pTemp, pValue, last);
		delete [] pValue;
		pValue = pTemp;
	}
}

CBigInt CBigInt::operator ++(int)         //a++
{
	CBigInt a(*this);
	operator += (1);
	return a;
}

CBigInt  CBigInt::operator ++()			//++a
{
	return operator += (1);
}

inline DWORD CBigInt::LeastOver(DWORD n)
{	
	__asm
	{
		bsr ebx, n;
		bsf ecx, n;
		cmp ebx, ecx;
		je  to_set;
		inc ebx;
to_set:
		xor eax, eax;
		bts eax, ebx;
	}
}

//////////////////////////////////////////////////////////////////////
// CMyException Class
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyException::CMyException(char* msg, UINT uErrorNo)
{
	m_szMsg = msg;
	m_uErrorNo = uErrorNo;
}

CMyException::~CMyException()
{
	
}

CBigInt& CBigInt::Half(DWORD dwTimes /*= 1*/)
{	
	DWORD dwStep = dwTimes / 32;
	if (dwStep >= last)
	{
		*pValue = 0;
		last = 1;
		return *this;
	}
	else if (dwStep > 0)
	{
		MemCpy(pValue, &pValue[dwStep], last-=dwStep);
	}	
	if (dwTimes % 32 != 0)
	{
		__asm 
		{
			mov ebx, this;		
			mov edi, [ebx]this.pValue;
			mov ebx, [ebx]this.last;			
			dec ebx;
			mov ecx, dwTimes;
			xor edx, edx;
L1: 			
			cmp ebx, edx;
			je  L2;
			mov eax, 4[edi][edx*4];		
			shrd [edi][edx*4], eax, cl;
			inc edx;
			jmp L1;
L2:
			xor eax, eax;
			shrd [edi][edx*4], eax, cl;
		}
		if (last > 1 && pValue[last-1] == 0)
		{     
			last --;				
		}	
	}
	return *this;
}

CBigInt CBigInt::operator /= (CBigInt& x)//返回余數
{
	if (x == 0)		//除數為0
	{
		CMyException* exception = new CMyException("除數為0", 
My_ErrorNo_ZeroByDiv);
		throw exception;		
	}

	if (*this == 0 || x == 1)//被除數為0或除數為1
	{
		return *this;
	}

	if (x.last == 1)	//除數為DWORD時
	{
		return operator /= (x.pValue[0]);
	}

	//商數
	CBigInt r;
	r.Expand(LeastOver(last-x.last+1));
	r.last = last- x.last + 1;
	memset(r.pValue, 0, 4*r.len);

	//減數數組,分別為x*2^i, (i從0到31),暫時為空,如需要再分配
	CBigInt* xx[32];
	xx[0] = new CBigInt(x);
	for (int i=1; i<32; i++)
	{
		xx[i] = NULL;
	}	

	//除數高位第一個1的位置(二進制)
	DWORD bit_x = x.pValue[x.last-1];
	__asm
	{
		bsr eax, bit_x;
		mov bit_x, eax
	}

	int nXX;  //減數在減數數組中的編號
	while (*this >= *xx[0])
	{			
		__asm
		{
			//計算出高DWORD中二進制位1的位置差
			mov ebx, this;
			mov esi, [ebx]this.pValue;
			mov ecx, [ebx]this.last;
			bsr eax, [esi][4*ecx-4];
			sub eax, bit_x;			
			add eax, 32;
			and eax, 0x1f;
			mov nXX, eax;

			//如果減數指針為空,則新分配
			mov eax, type xx;
			mul nXX;
			cmp xx[eax], 0;
			jne to_cmp;
		}
		
		xx[nXX] = new CBigInt(x);
		xx[nXX]->Double(nXX);
		
		__asm
		{
to_cmp:
		//比較
			mov eax, type xx;
			mul nXX;
			mov ebx, xx[eax];						
			mov esi, [ebx]xx.pValue;
			mov ecx, [ebx]xx.last;
			mov eax, ecx;
			dec eax;
			shl eax, 2;
			add esi, eax;

			mov edx, this;
			mov edi, [edx]this.pValue;
			mov eax, [edx]this.last;
			dec eax;
			shl eax, 2;
			add edi, eax;

			
			repe cmpsd;
			jbe to_sub;

			//減數變為前一個
			//如果減數指針為空,則新分配
			add nXX, 31;
			and nXX, 0x1f;
			mov eax, type xx;
			mul nXX;
			cmp xx[eax], 0;
			jne to_sub;
		}
		xx[nXX] = new CBigInt(x);
		xx[nXX]->Double(nXX);
		__asm
		{
to_sub:	
			mov eax, type xx;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产欧美日韩另类综合 | 国产91精品一区二区麻豆网站| 欧美色精品在线视频| 亚洲综合无码一区二区| 欧美羞羞免费网站| 婷婷一区二区三区| 日韩你懂的电影在线观看| 激情六月婷婷综合| 国产人成亚洲第一网站在线播放| 高清不卡在线观看| 国产乱码一区二区三区| 国产精品国产a| 欧美日韩国产中文| 激情综合色综合久久综合| 欧美国产精品专区| 在线视频欧美区| 日日夜夜精品视频天天综合网| 日韩精品一区二区三区视频播放 | 亚洲成人在线免费| 91精品国产综合久久久久久久久久| 毛片基地黄久久久久久天堂| 欧美极品另类videosde| 欧美视频日韩视频在线观看| 美腿丝袜亚洲三区| 亚洲天堂福利av| 日韩亚洲欧美成人一区| 成人激情免费视频| 日韩精品欧美成人高清一区二区| 国产欧美一区二区精品婷婷 | 97久久超碰国产精品| 亚洲一区免费观看| 久久这里只有精品首页| 91福利国产精品| 国产一区二区三区最好精华液| 亚洲四区在线观看| 欧美v亚洲v综合ⅴ国产v| www.av精品| 久久精品99国产国产精| 亚洲日本在线a| 精品国产自在久精品国产| 91麻豆免费观看| 精品一二线国产| 亚洲一级二级三级| 亚洲国产激情av| 欧美一级日韩不卡播放免费| 91网站最新网址| 国产精品66部| 美女爽到高潮91| 一区二区三区日本| 中文字幕在线观看不卡| 欧美不卡视频一区| 91.com视频| 日本大香伊一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 亚洲高清不卡在线| 悠悠色在线精品| 亚洲四区在线观看| 国产人妖乱国产精品人妖| 日韩精品中午字幕| 欧美精品tushy高清| 在线视频欧美精品| 99天天综合性| 国产一区二区三区四区在线观看| 日韩激情在线观看| 午夜视频在线观看一区| 亚洲综合激情网| 综合网在线视频| 中文字幕一区二区在线观看| 国产女人aaa级久久久级| 精品国产乱码久久久久久闺蜜| 欧美久久久一区| 欧美日韩高清一区二区三区| 欧美日韩视频一区二区| 欧美特级限制片免费在线观看| 91亚洲国产成人精品一区二区三| 成人免费毛片aaaaa**| 国产91露脸合集magnet| 国产91露脸合集magnet| www.激情成人| 色偷偷久久人人79超碰人人澡 | 日本道色综合久久| 色综合久久中文综合久久牛| 一本久道久久综合中文字幕| 色成年激情久久综合| 在线日韩一区二区| 欧美伦理影视网| 欧美日韩亚洲综合在线| 欧美精品丝袜久久久中文字幕| 欧美日韩国产免费| 日韩一区二区在线观看视频播放| 日韩一级免费观看| 久久久久久久综合色一本| 国产午夜精品久久久久久久| 中文字幕亚洲精品在线观看| 亚洲男人的天堂一区二区| 亚洲狠狠爱一区二区三区| 免费人成精品欧美精品| 国产一区二区伦理片| 成人aaaa免费全部观看| 在线观看亚洲专区| 欧美一区二区三区喷汁尤物| 久久新电视剧免费观看| 中文字幕一区三区| 亚洲福利电影网| 国内欧美视频一区二区| 成年人国产精品| 欧美色国产精品| 精品国产一区二区三区久久久蜜月 | 亚洲超丰满肉感bbw| 奇米影视一区二区三区| 国产成人啪午夜精品网站男同| 99久久精品情趣| 777亚洲妇女| 国产欧美一区二区三区在线老狼| 亚洲老司机在线| 精品一区二区三区蜜桃| 91原创在线视频| 日韩欧美www| 亚洲欧美精品午睡沙发| 理论电影国产精品| 99国产精品久久| 日韩一级精品视频在线观看| 国产精品国产三级国产普通话蜜臀| 亚洲成人激情综合网| 国产成人免费高清| 7777精品伊人久久久大香线蕉经典版下载 | 色欧美乱欧美15图片| 精品久久久久久最新网址| 亚洲丝袜美腿综合| 奇米影视一区二区三区小说| 91美女片黄在线| 久久久久九九视频| 无吗不卡中文字幕| 91在线观看成人| 久久久久国产精品厨房| 日韩高清中文字幕一区| 色综合久久久久综合体| 久久影视一区二区| 亚洲chinese男男1069| av网站免费线看精品| 久久综合av免费| 日本欧美一区二区在线观看| 91美女片黄在线观看91美女| 国产日韩欧美不卡| 免费看日韩a级影片| 欧美在线一二三| 亚洲视频在线一区观看| 国产成人高清在线| 久久综合九色综合97_久久久| 日韩精品每日更新| 在线免费精品视频| 亚洲视频一区二区在线观看| 国产高清无密码一区二区三区| 91精品国产91久久久久久一区二区 | 色欧美乱欧美15图片| 国产精品丝袜久久久久久app| 久久国产精品免费| 91精品婷婷国产综合久久性色| 亚洲在线成人精品| 色婷婷香蕉在线一区二区| 亚洲婷婷综合色高清在线| 成人va在线观看| 亚洲国产成人午夜在线一区 | 日本一区二区视频在线观看| 经典三级在线一区| 精品国产sm最大网站免费看| 蜜桃av噜噜一区二区三区小说| 制服视频三区第一页精品| 首页国产欧美久久| 欧美日韩国产免费一区二区 | 97久久精品人人爽人人爽蜜臀| 国产精品久久久久一区二区三区共| 国产精品一卡二卡在线观看| 欧美成人午夜电影| 国产一区二区三区综合| 久久久99精品免费观看| 成人av中文字幕| 亚洲人成精品久久久久| 在线观看亚洲精品| 亚洲动漫第一页| 91精品国产一区二区三区蜜臀| 舔着乳尖日韩一区| 欧美刺激午夜性久久久久久久| 美脚の诱脚舐め脚责91| 久久久久免费观看| 成人av高清在线| 亚洲永久精品国产| 日韩免费视频一区| 高清不卡一二三区| 一区二区三区高清| 欧美日韩高清在线| 国产美女娇喘av呻吟久久| 国产精品福利一区| 欧美视频一区二区| 精久久久久久久久久久| 国产精品蜜臀av| 精品视频一区二区不卡| 精品一区二区三区av| 国产精品盗摄一区二区三区| 欧美日韩国产成人在线免费|