青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

WaiTing編程之家

WaiTing編程之家
posts - 1, comments - 0, trackbacks - 0, articles - 1
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

C++大數(shù)精度計(jì)算

Posted on 2010-02-20 11:52 WaiTing 閱讀(369) 評(píng)論(0)  編輯 收藏 引用
原文:http://www.x86pro.com/articleViewer.php?pid=160

固定精度版本,即運(yùn)行時(shí)無法修改精度.

頭文件:
// WTNumber.h: interface for the CWTNumber class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WTNUMBER_H__92E62B40_491A_4A75_AB89_FFB160DB2343__INCLUDED_)
#define AFX_WTNUMBER_H__92E62B40_491A_4A75_AB89_FFB160DB2343__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define INT_BIT_MAX 255
#define FLOAT_BIT_MAX 255

class CWTNumber  
{
private:
    
int intbits;                     /* 整數(shù)數(shù)位*/
    
int floatbits;                   /* 小數(shù)有效數(shù)位*/
    
char infinite;                   /* 無窮大*/
    
char sign;                       /* 符號(hào)*/
    
char intpart[INT_BIT_MAX];       /* 整數(shù)部分*/
    
char floatpart[FLOAT_BIT_MAX];   /* 小數(shù)部分*/
private:
    
char* m_sz;
public:
    
/* 算術(shù)函數(shù)指針類型.*/
    typedef 
void (*PFNCALC)(const CWTNumber&,const CWTNumber&,CWTNumber&);
    CWTNumber();
    CWTNumber(
const char* szNum);
    
~CWTNumber();
    
/* 轉(zhuǎn)換成字符串*/
    
char* ToString();
    
void FreeString();
    
/* 初始化WTNumber為0.*/
    
void InitWTNumberToZero();
    
/* 判斷需要多少個(gè)字符空間存儲(chǔ)WTNumber轉(zhuǎn)換的字符串.*/
    
int StrLenByWTNumber();
    
/* 從字符串轉(zhuǎn)換到WTNumber.*/
    
void StrToWTNumber(const char *arr);
    
/* 從WTNumber轉(zhuǎn)換到字符串.*/
    
void WTNumberToStr(char *szBuf);
    
/* 調(diào)節(jié)數(shù)位,刪除最高整數(shù)位是0的和最低小數(shù)位是0的數(shù)位.*/
    
void AdjustBits();
    
/* 移動(dòng)小數(shù)點(diǎn),delta=0不移動(dòng),delta<0往左移動(dòng),delta>0往右移動(dòng).*/
    
void MoveFloatPoint(int delta);
    
/* 使無窮大 */
    
void MakeInfinite();
    
/* 比較2個(gè)數(shù)大小 */
    
int WTCompare(const CWTNumber& n) const;
    
/* 判斷是否為0 */
    
int IsZero() const;
    
/* 賦值號(hào)重載*/
    CWTNumber
& operator=(const CWTNumber& n);

    
/* 運(yùn)算符重載 */
    CWTNumber 
operator+(const CWTNumber& n);
    CWTNumber 
operator-(const CWTNumber& n);
    CWTNumber 
operator*(const CWTNumber& n);
    CWTNumber 
operator/(const CWTNumber& n);
    CWTNumber
& operator+=(const CWTNumber& n);
    CWTNumber
& operator-=(const CWTNumber& n);
    CWTNumber
& operator*=(const CWTNumber& n);
    CWTNumber
& operator/=(const CWTNumber& n);

    
bool operator>(const CWTNumber& n);
    
bool operator>=(const CWTNumber& n);
    
bool operator<(const CWTNumber& n);
    
bool operator<=(const CWTNumber& n);
    
bool operator==(const CWTNumber& n);
    
bool operator!=(const CWTNumber& n);
    
/* 加法*/
    
static void WTAdd(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res);
    
/* 乘法*/
    
static void WTMultiply(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res);
    
/* 減法*/
    
static void WTSubtract(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res);
    
/* 除法*/
    
static void WTDivide(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res);
    
/* 根據(jù)算術(shù)函數(shù)返回結(jié)果 */
    
static char *Result(const char *val1,const char *val2,PFNCALC pfnCalc);
};


#endif // !defined(AFX_WTNUMBER_H__92E62B40_491A_4A75_AB89_FFB160DB2343__INCLUDED_)

源文件:
// WTNumber.cpp: implementation of the CWTNumber class.
//
//////////////////////////////////////////////////////////////////////
#include <string.h>
#include 
<stdlib.h>
#include 
"WTNumber.h"

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

CWTNumber::CWTNumber()
{
    InitWTNumberToZero();
}
CWTNumber::CWTNumber(
const char* szNum)
{
    InitWTNumberToZero();
    StrToWTNumber(szNum);
}
CWTNumber::
~CWTNumber()
{
    FreeString();
}
void CWTNumber::FreeString()
{
    
if(m_sz) delete []m_sz;
    m_sz
=NULL;
}
void CWTNumber::InitWTNumberToZero()
{
    memset(
this,0,sizeof(CWTNumber));
}
int CWTNumber::StrLenByWTNumber()
{
    
int len = floatbits+intbits+1;
    
if(intbits==0) len++;    /* .1 --> 0.1*/
    
if(floatbits) len++;    /* '.'*/
    
if(sign) len++;        /* '-'*/
    
if(infinite) return 11;    /* #INFINITE */
    
return len;
}
void CWTNumber::StrToWTNumber(const char *arr)
{
    
char *point;
    InitWTNumberToZero();
    
if(*arr=='-')    /* 如果是負(fù)數(shù)*/
    {
        arr
++;
        sign
=1;
    }
    point
=strchr(arr,'.');
    
if(point)    /* 找到小數(shù)點(diǎn) */
    {
        
int n=intbits=point-arr;    /* 計(jì)算出整數(shù)數(shù)位 */
        
while(n)    /* 整數(shù)數(shù)位不==0則循環(huán) */
        {
            intpart[intbits
-n]=arr[n-1]-'0';    /* 將數(shù)字低位存在低下標(biāo)元素*/
            n
--;
        }
        
while(*++point)
        {
            floatpart[floatbits]
=*point-'0';
            floatbits
++;
        }
    }
    
else    /* 說明沒寫小數(shù)點(diǎn),全是整數(shù).*/
    {
        
int n=intbits=strlen(arr);
        
while(n)
        {
            intpart[intbits
-n]=arr[n-1]-'0';
            n
--;
        }
    }
    AdjustBits();
    
/* 處理-0 和0的情況*/
    
if(floatbits==0)
    {
        
if(intbits==0 || intbits==1&&intpart[0]==0)
            sign
=0;
    }
}

void CWTNumber::WTNumberToStr(char *szBuf)
{
    
int n=intbits,c;
    memset(szBuf,
0,StrLenByWTNumber());
    
if(sign)    /* 如果是負(fù)數(shù)*/
    {
        
*szBuf++='-';
    }
    
if(infinite) 
    {
        strcat(szBuf,
"#INFINITE");
        
return;
    }
    
while(n)
    {
        szBuf[intbits
-n]=intpart[n-1]+'0';
        n
--;
    }
    c
=0;    /* 是否加了0*/
    
if(intbits==0) {
        strcat(szBuf,
"0");
        c
=1;
    }
    
if(floatbits) strcat(szBuf,".");
    n
=0;
    
while(n<floatbits)
    {
        szBuf[intbits
+1+n+c]=floatpart[n]+'0';
        n
++;
    }
}
void CWTNumber::AdjustBits()
{
    
while(intbits>1&&intpart[intbits-1]==0) intbits--;
    
while(floatbits&&floatpart[floatbits-1]==0) floatbits--;
}
void CWTNumber::MoveFloatPoint(int delta)
{
    
/* delta<0則往左移動(dòng)小數(shù)點(diǎn),delta>0則向右移動(dòng)小數(shù)點(diǎn) */
    
if(delta)
    {
        CWTNumber n
=*this;
        InitWTNumberToZero();
        sign
=n.sign;
        
if(delta<0)
        {
            
int i;
            delta
=-delta;
            
for(i=delta;i<n.intbits;i++)
            {
                intpart[intbits
++]=n.intpart[i];
            }
            
for(i=delta-1;i>=0;i--)
            {
                floatpart[floatbits
++]=n.intpart[i];
            }
            
for(i=0;i<n.floatbits;i++)
            {
                floatpart[floatbits
++]=n.floatpart[i];
            }
        }
        
else
        {
            
int i;
            
for(i=delta;i<n.floatbits;i++)    /* 處理小數(shù)部分*/
            {
                floatpart[floatbits
++]=n.floatpart[i];
            }
            
for(i=delta-1;i>=0;i--)    /* 小數(shù)到整數(shù)的部分*/
            {
                intpart[intbits
++]=n.floatpart[i];
            }
            
for(i=0;i<n.intbits;i++)    /* 整數(shù)部分*/
            {
                intpart[intbits
++]=n.intpart[i];
            }
        }
    }
    AdjustBits();
}
void CWTNumber::MakeInfinite()
{
    infinite
=1;
}

int CWTNumber::WTCompare(const CWTNumber& n) const
{
    
/* 首先是比較符號(hào)*/
    
if(sign==0&&n.sign!=0)    /* pn1是正數(shù),pn2是負(fù)數(shù)*/
        
return 1;    /* >*/
    
else if(sign!=0&&n.sign==0)    /* pn1是負(fù)數(shù),pn2是正數(shù)*/
        
return -1;    /* <*/
    
else    /* 同號(hào)狀態(tài)*/
    {
        
/* 比較整數(shù)部分*/
        
if(intbits>n.intbits)    /* pn1整數(shù)數(shù)位多*/
            
return sign?-1:1;
        
else if(intbits<n.intbits)
            
return sign?1:-1;
        
else    /* 整數(shù)數(shù)位相同*/
        {
            
int i=intbits-1;    /*指到最高位*/
            
while(i>=0)
            {
                
if(intpart[i]>n.intpart[i])
                    
return sign?-1:1;
                
else if(intpart[i]<n.intpart[i])
                    
return sign?1:-1;
                
else i--;
            }
            
/* 整數(shù)部分相同,比較小數(shù)部分*/
            
for(i=0;i<floatbits&&i<n.floatbits;)
            {
                
if(floatpart[i]>n.floatpart[i])
                    
return sign?-1:1;
                
else if(floatpart[i]<n.floatpart[i])
                    
return sign?1:-1;
                
else i++;
            }
            
if(i<floatbits) return sign?-1:1;
            
if(i<n.floatbits) return sign?1:-1;
            
return 0;    /* 相等*/
        }
    }
}
int CWTNumber::IsZero() const
{
    
if(floatbits==0&&intbits==0return 1;
    
if(floatbits==0&&intbits==1&&intpart[0]==0return 1;
    
return 0;
}

void CWTNumber::WTAdd(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res)
{
    Res.InitWTNumberToZero();
    
if(n1.sign^n2.sign)    /*異號(hào)*/
    {
        CWTNumber rn2
=n2;
        rn2.sign
=n1.sign;
        WTSubtract(n1,rn2,Res);
    }
    
else    /*同號(hào)*/
    {
        
int maxfloatbits=n1.floatbits>n2.floatbits?n1.floatbits:n2.floatbits;
        
int addbit=0;    /* 進(jìn)位值*/
        
int i,j;
        
for(i=maxfloatbits-1;i>=0;i--)
        {
            
int value=n1.floatpart[i]+n2.floatpart[i]+addbit;
            addbit
=value/10;    /* 看看是否超過10. 設(shè)置進(jìn)位值*/
            Res.floatpart[i]
=value%10;
        }
        Res.floatbits
=maxfloatbits;
        
/* 到此,小數(shù)部分計(jì)算完畢.*/
        
for(j=0;j<n1.intbits||j<n2.intbits;j++)
        {
            
int value=n1.intpart[j]+n2.intpart[j]+addbit;
            addbit
=value/10;
            Res.intpart[j]
=value%10;
            Res.intbits
++;
        }
        
if(addbit>0)
        {
            Res.intpart[j]
=addbit;
            Res.intbits
++;
        }
        Res.sign
=n1.sign;    /*決定符號(hào)*/
        Res.AdjustBits();
    }
}

void CWTNumber::WTMultiply(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res)
{
    CWTNumber z1
=n1,z2=n2;
    CWTNumber sum;
    
int i,j;
    sum.InitWTNumberToZero();
    Res.InitWTNumberToZero();
    z1.MoveFloatPoint(z1.floatbits);
    z2.MoveFloatPoint(z2.floatbits);
    
/* 計(jì)算z1*z2 */
    
for(i=0;i<z2.intbits;i++)
    {
        CWTNumber tmp;    
/* 存放臨時(shí)乘積*/
        
int addbit=0;
        tmp.intbits
=z1.intbits+i;
        
for(j=0;j<z1.intbits;j++)
        {
            
int value = z2.intpart[i]*z1.intpart[j]+addbit;
            addbit
=value/10;
            tmp.intpart[j
+i]=value%10;
        }
        
if(addbit)
        {
            tmp.intpart[j
+i]=addbit;
            tmp.intbits
++;
        }
        WTAdd(sum,tmp,Res);
        sum
=Res;
    }
    Res
=sum;
    Res.MoveFloatPoint(
-(n1.floatbits+n2.floatbits));
    
/* 判斷符號(hào),異號(hào)為負(fù)*/
    
if(n1.sign^n2.sign) Res.sign=1;
}

void CWTNumber::WTSubtract(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res)
{
    Res.InitWTNumberToZero();
    
if(n1.sign^n2.sign)    /* 異號(hào)情況*/
    {
        CWTNumber rn2
=n2;
        rn2.sign
=n1.sign;
        WTAdd(n1,rn2,Res);
    }
    
else    /* 同號(hào)情況*/
    {
        
int cmp=n1.WTCompare(n2);
        
int swapflag,i,maxfloatbits,subtractbit;
        
if(cmp==0return;    /* 相等就沒必要再減了.*/
        swapflag
=n1.sign==0?cmp==-1:cmp==1;
        
const CWTNumber* pn1=&n1;
        
const CWTNumber* pn2=&n2;
        
if(swapflag)
        {
            
const CWTNumber *t=pn1;
            pn1
=pn2;
            pn2
=t;
        }
        maxfloatbits
=pn1->floatbits>pn2->floatbits?pn1->floatbits:pn2->floatbits;
        subtractbit
=0;    /* 退位值*/
        
/* 先計(jì)算小數(shù)部分*/
        
for(i=maxfloatbits-1;i>=0;i--)
        {
            
if(pn1->floatpart[i]-subtractbit<pn2->floatpart[i])
            {
                
int value=pn1->floatpart[i]-pn2->floatpart[i]-subtractbit+10;
                subtractbit
=1;
                Res.floatpart[i]
=value;
            }
            
else
            {
                
int value=pn1->floatpart[i]-pn2->floatpart[i]-subtractbit;
                subtractbit
=0;
                Res.floatpart[i]
=value;
            }
        }
        Res.floatbits
=maxfloatbits;
        
/* 至此小數(shù)部分計(jì)算完畢.*/
        
for(i=0;i<pn1->intbits||i<pn2->intbits;i++)
        {
            
if(pn1->intpart[i]-subtractbit<pn2->intpart[i])
            {
                
int value=pn1->intpart[i]-pn2->intpart[i]-subtractbit+10;
                subtractbit
=1;
                Res.intpart[i]
=value;
            }
            
else
            {
                
int value=pn1->intpart[i]-pn2->intpart[i]-subtractbit;
                subtractbit
=0;
                Res.intpart[i]
=value;
            }
            Res.intbits
++;
        }
        Res.sign
=swapflag?!n1.sign:n1.sign;    /*決定符號(hào)*/
        Res.AdjustBits();
    }
}
void CWTNumber::WTDivide(const CWTNumber& n1,const CWTNumber& n2,CWTNumber& Res)
{
    CWTNumber z1
=n1,z2=n2;
    
int deta=z2.floatbits-z1.floatbits;
    z1.MoveFloatPoint(z1.floatbits);
    z2.MoveFloatPoint(z2.floatbits);
    Res.InitWTNumberToZero();
    
if(n1.IsZero()) return ;
    
if(n2.IsZero()) {
        Res.sign
=n1.sign;
        Res.MakeInfinite();
        
return ;
    }
    z1.sign
=z2.sign=0;                /*統(tǒng)一符號(hào),便于比較大小*/ 
    
while(z1.intbits!=z2.intbits) {    /*確保數(shù)位相等,這步耗費(fèi)很多時(shí)間*/
        
if(z1.intbits<z2.intbits) {
            z1.MoveFloatPoint(
1);
            deta
--;
        } 
else {
            z2.MoveFloatPoint(
1);
            deta
++;
        }
    }
    
while(Res.floatbits<(INT_BIT_MAX/2)) {
        
int cmp=z1.WTCompare(z2);
        
int n=10;
        CWTNumber mulres,subres;
        
if(cmp==-1) {      /*z1<z2*/
            z1.MoveFloatPoint(
1);
            Res.floatpart[Res.floatbits
++]=0;
            
continue;
        } 
else if(cmp==0) { /*z1==z2*/
            Res.floatpart[Res.floatbits
++]=1;
            
break;
        }
        
do {    /*找商*/
            CWTNumber tmp;
            tmp.intpart[
0]=--n;
            tmp.intbits
=1;
            WTMultiply(z2,tmp,mulres);
        } 
while((cmp=mulres.WTCompare(z1))==1);
        Res.floatpart[Res.floatbits
++]=n;
        
if(cmp==0break;
        WTSubtract(z1,mulres,subres);
        subres.MoveFloatPoint(
1);
        z1
=subres;
    }
    Res.MoveFloatPoint(
1);
    Res.MoveFloatPoint(deta);
    
/* 判斷符號(hào),異號(hào)為負(fù)*/
    
if(n1.sign^n2.sign) Res.sign=1;
}
char *CWTNumber::Result(const char *val1,const char *val2,PFNCALC pfnCalc)
{
    CWTNumber n1,n2,res;
    n1.StrToWTNumber(val1);
    n2.StrToWTNumber(val2);
    pfnCalc(n1,n2,res);
    
return res.ToString();
}

char* CWTNumber::ToString()
{
    FreeString();
    m_sz
=new char[StrLenByWTNumber()];
    WTNumberToStr(m_sz);
    
return m_sz;
}

CWTNumber
& CWTNumber::operator=(const CWTNumber& n)
{
    
if(this!=&n) {
        FreeString();
        memcpy(
this,&n,sizeof(CWTNumber));
        
if(n.m_sz)
        {
            m_sz
=strdup(n.m_sz);
        }
    }
    
return *this;
}


CWTNumber CWTNumber::
operator+(const CWTNumber& n)
{
    CWTNumber res;
    CWTNumber::WTAdd(
*this,n,res);
    
return res;
}
CWTNumber CWTNumber::
operator-(const CWTNumber& n)
{
    CWTNumber res;
    CWTNumber::WTSubtract(
*this,n,res);
    
return res;
}
CWTNumber CWTNumber::
operator*(const CWTNumber& n)
{
    CWTNumber res;
    CWTNumber::WTMultiply(
*this,n,res);
    
return res;
}
CWTNumber CWTNumber::
operator/(const CWTNumber& n)
{
    CWTNumber res;
    CWTNumber::WTDivide(
*this,n,res);
    
return res;
}
CWTNumber
& CWTNumber::operator+=(const CWTNumber& n)
{
    CWTNumber n1
=*this,n2=n;
    CWTNumber::WTAdd(n1,n2,
*this);
    
return *this;
}
CWTNumber
& CWTNumber::operator-=(const CWTNumber& n)
{
    CWTNumber n1
=*this,n2=n;
    CWTNumber::WTSubtract(n1,n2,
*this);
    
return *this;
}
CWTNumber
& CWTNumber::operator*=(const CWTNumber& n)
{
    CWTNumber n1
=*this,n2=n;
    CWTNumber::WTMultiply(n1,n2,
*this);
    
return *this;
}
CWTNumber
& CWTNumber::operator/=(const CWTNumber& n)
{
    CWTNumber n1
=*this,n2=n;
    CWTNumber::WTDivide(n1,n2,
*this);
    
return *this;
}
bool CWTNumber::operator>(const CWTNumber& n)
{
    
return WTCompare(n)==1;
}
bool CWTNumber::operator>=(const CWTNumber& n)
{
    
return WTCompare(n)!=-1;
}
bool CWTNumber::operator<(const CWTNumber& n)
{
    
return WTCompare(n)==-1;
}
bool CWTNumber::operator<=(const CWTNumber& n)
{
    
return WTCompare(n)!=1;
}
bool CWTNumber::operator==(const CWTNumber& n)
{
    
return WTCompare(n)==0;
}
bool CWTNumber::operator!=(const CWTNumber& n)
{
    
return WTCompare(n)!=0;
}

使用演示:
#include <stdio.h>
#include 
"WTNumber.h"

int main()
{
    
char sz1[256]="";
    
char sz2[256]="";
    puts(
"請(qǐng)輸入兩個(gè)數(shù)字:");
    
while(scanf("%s%s",sz1,sz2)!=-1)
    {
        CWTNumber n1(sz1),n2(sz2);
        printf(
"兩數(shù)相加結(jié)果:\n%s\n",(n1+n2).ToString());
        printf(
"兩數(shù)相減結(jié)果:\n%s\n",(n1-n2).ToString());
        printf(
"兩數(shù)相乘結(jié)果:\n%s\n",(n1*n2).ToString());
        printf(
"兩數(shù)相除結(jié)果:\n%s\n",(n1/n2).ToString());
        puts(
"請(qǐng)輸入兩個(gè)數(shù)字:");
    }
    
return 0;
}

運(yùn)行結(jié)果:
請(qǐng)輸入兩個(gè)數(shù)字:
13 7
兩數(shù)相加結(jié)果:
20
兩數(shù)相減結(jié)果:
6
兩數(shù)相乘結(jié)果:
91
兩數(shù)相除結(jié)果:
1.857142857142857142857142857142857142857142857142857142857142857142857142857142
85714285714285714285714285714285714285714285714

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩精品久久奇米色影视 | 久久国产加勒比精品无码| 激情六月婷婷久久| 欧美日韩日日骚| 久久免费国产精品| 欧美一区二区免费观在线| 一本色道88久久加勒比精品| 亚洲成在线观看| 久久成人在线| 亚洲一卡久久| aⅴ色国产欧美| 在线观看日韩欧美| 亚洲欧美日韩精品久久奇米色影视| 亚洲欧美日韩国产精品| 99国产精品99久久久久久粉嫩| 韩日午夜在线资源一区二区| 国产精品入口麻豆原神| 欧美日韩在线视频首页| 欧美精品成人一区二区在线观看| 久久综合九色欧美综合狠狠| 久久久久国产一区二区三区四区| 欧美影片第一页| 欧美亚洲日本国产| 亚洲欧美日韩一区二区在线| 亚洲在线不卡| 亚洲在线观看免费| 亚洲女爱视频在线| 亚洲欧美在线观看| 欧美一区=区| 欧美影视一区| 久久久国产成人精品| 久久九九国产| 久久久夜精品| 女人香蕉久久**毛片精品| 欧美成人a视频| 欧美激情在线观看| 欧美日韩国产美| 欧美视频三区在线播放| 欧美日韩精品免费观看视一区二区| 欧美男人的天堂| 欧美性猛交xxxx乱大交退制版| 欧美涩涩视频| 国产精品一区二区久久| 国产一区二区成人久久免费影院| 国产字幕视频一区二区| 亚洲第一成人在线| 亚洲精品免费在线播放| 亚洲午夜视频在线观看| 午夜精品成人在线| 久久国产色av| 免费成人高清| 亚洲黄色在线视频| 一区二区日韩伦理片| 亚洲欧美日韩人成在线播放| 久久精品最新地址| 欧美激情亚洲自拍| 国产精品igao视频网网址不卡日韩| 国产精品最新自拍| 精品动漫3d一区二区三区| 亚洲精品美女在线| 亚洲欧美日韩在线播放| 久久这里只有精品视频首页| 亚洲国产精品成人久久综合一区| 一本大道久久a久久精二百| 亚洲男女毛片无遮挡| 久久久久久噜噜噜久久久精品| 欧美刺激性大交免费视频| 欧美亚州一区二区三区| 国产亚洲第一区| 亚洲国产网站| 亚洲欧美日韩视频二区| 欧美91视频| 这里只有精品视频| 久久久人人人| 欧美性片在线观看| 精品成人一区二区三区| 亚洲一区二区精品视频| 乱中年女人伦av一区二区| 亚洲伦理网站| 久久久99精品免费观看不卡| 欧美日韩一区二区三区免费| 国外成人在线视频网站| 一个人看的www久久| 久久综合久久综合九色| 夜久久久久久| 欧美xx视频| 国产视频一区二区在线观看| 亚洲精品视频在线播放| 久久精品国产69国产精品亚洲| 欧美高清视频www夜色资源网| 亚洲视频精选在线| 欧美成人午夜视频| 国产亚洲激情在线| 亚洲午夜av在线| 欧美成人一二三| 亚洲欧美www| 欧美日韩国产页| 欧美精品xxxxbbbb| 国内欧美视频一区二区| 中国女人久久久| 欧美暴力喷水在线| 午夜精品久久久久久久久久久久 | 91久久视频| 久久精品一本| 国产日韩精品一区二区三区| 国产精品99久久久久久久女警| 久久在线免费视频| 午夜精品久久久久久久白皮肤 | 欧美成人激情在线| 国产主播一区二区三区| 午夜激情一区| 在线亚洲免费| 欧美日韩一区二区在线播放| 亚洲国产精品悠悠久久琪琪| 久久久精品2019中文字幕神马| 亚洲小少妇裸体bbw| 欧美午夜宅男影院在线观看| 亚洲免费精彩视频| 亚洲国产成人av在线| 快播亚洲色图| 激情自拍一区| 久久久之久亚州精品露出| 亚洲免费视频一区二区| 国产精品久久中文| 亚洲视频免费看| 亚洲美女黄色| 欧美日韩视频一区二区| 一区二区三区|亚洲午夜| 亚洲免费观看视频| 欧美日韩精品免费观看视频完整| 一区二区三区产品免费精品久久75 | 亚洲欧美一区二区三区极速播放| 国产精品久久久久久久免费软件 | 国产精品久久久久久久久免费桃花| 亚洲性av在线| 一本色道久久| 国产精品久久久免费| 午夜欧美精品| 亚洲无线视频| 国产欧美日韩亚洲精品| 久久精品国产欧美亚洲人人爽| 性高湖久久久久久久久| 国精品一区二区三区| 免费亚洲婷婷| 免费国产自线拍一欧美视频| 亚洲黄色av一区| 亚洲激情网址| 欧美日韩亚洲一区二区三区在线观看| 99热精品在线观看| 99视频精品全部免费在线| 欧美色一级片| 久久er99精品| 久久天天躁夜夜躁狠狠躁2022| 亚洲国产天堂久久国产91| 亚洲人线精品午夜| 国产精品多人| 久久精品国产99| 久久只有精品| 一本到高清视频免费精品| 一区二区三区国产在线观看| 国产精品一区二区三区免费观看| 欧美伊人影院| 久久这里只有| 亚洲午夜在线观看视频在线| 午夜免费在线观看精品视频| 在线免费不卡视频| 亚洲欧洲日产国码二区| 国产精品久久国产三级国电话系列| 久久成人精品无人区| 麻豆久久婷婷| 亚洲图片在线观看| 欧美影片第一页| 亚洲乱码国产乱码精品精可以看| 在线视频你懂得一区| 国内成人自拍视频| 亚洲激情视频网| 国产精品午夜春色av| 欧美成人一区二免费视频软件| 欧美日韩精品一区二区三区四区| 欧美伊人久久久久久午夜久久久久 | 有码中文亚洲精品| 欧美亚洲专区| 亚洲精品久久| 女主播福利一区| 在线视频日韩精品| 欧美日韩国产在线| 久久精品中文字幕一区| 免费中文字幕日韩欧美| 亚洲伊人久久综合| 久久精品夜色噜噜亚洲aⅴ| 一本一本大道香蕉久在线精品| 午夜精品久久久久| 99re6这里只有精品| 欧美中文字幕在线视频| 一本久久a久久免费精品不卡| 欧美一区二视频| 宅男噜噜噜66国产日韩在线观看| 久久精品成人一区二区三区蜜臀 | 亚洲伦伦在线| 欧美一级片久久久久久久|