ACM大数模板(支持正负整数)
之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多。
实现了基本的加减乘除和取模运算的操作符重载,大数除以大数难度太大就没实现,另外还实现了比较运算符,方便实际使用贴近内置类型的体验。
话不多说,贴代码。
/*BigInt.h*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXBIT 1007
#define BITTYPE int
class BigInt {
private:
BITTYPE bit[MAXBIT];
bool negative;//负数标志
public:
BigInt(); //默认构造函数,值为0
BigInt(const int); //构造函数
BigInt(const char *); //构造函数
BigInt(const BigInt &); //复制构造函数
/*重载赋值运算符*/
BigInt& operator=(const BigInt&);
BigInt& operator=(const int );
/*重载算数运算符*/
BigInt operator+(const BigInt& )const;
BigInt operator+(const int )const;
BigInt operator-(const BigInt& )const;
BigInt operator-(const int )const;
BigInt operator*(const BigInt& )const;
BigInt operator*(const int )const;
BigInt operator/(const int )const;
int operator%(const int )const;
/*重载比较运算符*/
bool operator>(const BigInt& )const;
bool operator>(const int )const;
bool operator>=(const BigInt& )const;
bool operator>=(const int )const;
bool operator<(const BigInt& )const;
bool operator<(const int )const;
bool operator<=(const BigInt& )const;
bool operator<=(const int )const;
bool operator==(const BigInt& )const;
bool operator==(const int )const;
bool operator!=(const BigInt& )const;
bool operator!=(const int )const;
void print() const;//输出数值
bool isZero() const;//是否为0
bool isPositive() const;//是否为正数
bool isNegative() const;//是否为负数
bool nonNegative() const;//是否为非负数
private:
BigInt opposite()const;//取相反数
BigInt absoluteAdd(const BigInt&)const;//加上绝对值
BigInt absoluteMinus(const BigInt&)const;//减去绝对值小于自身的数的绝对值
bool absoluteEqual(const BigInt&)const;//绝对值等于
bool absoluteGreater(const BigInt&)const;//绝对值大于
bool absoluteEqualGreater(const BigInt&)const;//绝对值大于等于
};
BigInt::BigInt()
{
memset(bit,,sizeof(bit));
negative = false;
}
BigInt::BigInt(const int n)
{
memset(bit,,sizeof(bit));
int nn = n;
) negative = false;
else {
negative = true;
nn = -nn;
}
;
while (nn) {
bit[pos++] = nn % ;
nn /= ;
}
}
BigInt::BigInt(const char *s)
{
int len = strlen(s);
bool valid = true;//符合数字格式
) {
]!=]!=])) valid = false;
; i<len; ++i) {
if (!isdigit(s[i])) valid = false;
}
}
) {
])) valid = false;
}
|| !valid) {
memset(bit,,sizeof(bit));
negative = false;
return;
}
, end = len-;
] == '+') {
negative = false;
++beg;
}
] == '-') {
bool zeroFlag = true;
; i<len; ++i) {
') {
zeroFlag = false;
break;
}
}
if (zeroFlag) negative = false;
else negative = true;
++beg;
}
else negative = false;
memset(bit,,sizeof(bit));
for (int i=beg; i<=end; ++i) {
bit[len--i] = s[i] - ';
}
}
BigInt::BigInt(const BigInt& n)
{
memcpy(bit,n.bit,sizeof(bit));
negative = n.negative;
}
BigInt& BigInt::operator=(const BigInt& n)
{
memcpy(bit,n.bit,sizeof(bit));
negative = n.negative;
return *this;
}
BigInt& BigInt::operator=(const int n)
{
return *this = BigInt(n);
}
BigInt BigInt::operator+(const BigInt& n)const
{
if ((!negative && !n.negative) || (negative && n.negative)) {
return this->absoluteAdd(n);
}
else {
if (absoluteEqual(n)) return BigInt();
else if (absoluteEqualGreater(n)) return this->absoluteMinus(n);
else return n.absoluteMinus(*this);
}
}
BigInt BigInt::operator+(const int n)const
{
return *this + BigInt(n);
}
BigInt BigInt::operator-(const BigInt& n)const
{
return *this + n.opposite();
}
BigInt BigInt::operator-(const int n)const
{
return *this - BigInt(n);
}
BigInt BigInt::operator*(const BigInt& n)const
{
if (isZero() || n.isZero()) return BigInt();
BigInt bi = BigInt();
if ((!negative && !n.negative) || (negative && n.negative)) {
bi.negative = false;
}
else bi.negative = true;
; i<MAXBIT; ++i) ; j<MAXBIT-i; ++j) {
bi.bit[i+j] += bit[i] * n.bit[j];
}
; i<MAXBIT-; ++i) {//进位
bi.bit[i+] += bi.bit[i] / ;
bi.bit[i] %= ;
}
return bi;
}
BigInt BigInt::operator*(const int n)const
{
return *this * BigInt(n);
}
BigInt BigInt::operator/(const int n)const
{//除以0直接返回0
) return BigInt();
BigInt bi = BigInt();
) || (negative && n<)) {
bi.negative = false;
}
else bi.negative = true;
;//累计除数
; i>=; --i) {
div = div * + bit[i];
bi.bit[i] = div / n;
div %= n;
}
return bi;
}
int BigInt::operator%(const int n)const
{
;//累计余数
; i>=; --i) {
//mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n;
mod = ((mod*) + bit[i]) % n;
}
return mod;
}
bool BigInt::operator>(const BigInt& n)const
{
if (!negative && n.negative) return true;
else if (negative && !n.negative) return false;
else if (!negative && !n.negative) return absoluteGreater(n);
else return n.absoluteGreater(*this);
}
bool BigInt::operator>(const int n)const
{
return *this > BigInt(n);
}
bool BigInt::operator>=(const BigInt& n)const
{
if (!negative && n.negative) return true;
else if (negative && !n.negative) return false;
else if (!negative && !n.negative) return absoluteEqualGreater(n);
else return n.absoluteEqualGreater(*this);
}
bool BigInt::operator>=(const int n)const
{
return *this >= BigInt(n);
}
bool BigInt::operator<(const BigInt& n)const
{
return n > *this;
}
bool BigInt::operator<(const int n)const
{
return *this < BigInt(n);
}
bool BigInt::operator<=(const BigInt& n)const
{
return n >= *this;
}
bool BigInt::operator<=(const int n)const
{
return *this <= BigInt(n);
}
bool BigInt::operator==(const BigInt& n)const
{
if (negative != n.negative) return false;
; i<MAXBIT; ++i) {
if (bit[i] != n.bit[i]) return false;
}
return true;
}
bool BigInt::operator==(const int n)const
{
return *this == BigInt(n);
}
bool BigInt::operator!=(const BigInt& n)const
{
if (negative != n.negative) return true;
; i<MAXBIT; ++i) {
if (bit[i] != n.bit[i]) return true;
}
return false;
}
bool BigInt::operator!=(const int n)const
{
return *this != BigInt(n);
}
void BigInt::print()const
{
if (negative) printf("-");
;
; --pos) {
if (bit[pos]) break;
}
; --i) printf("%d",bit[i]);
}
bool BigInt::isZero()const
{
bool zeroFlag = true;
; i<MAXBIT; ++i) {
) {
zeroFlag = false;
break;
}
}
return zeroFlag;
}
bool BigInt::isPositive()const
{
return !negative && !isZero();
}
bool BigInt::isNegative()const
{
return negative;
}
bool BigInt::nonNegative()const
{
return !negative;
}
BigInt BigInt::opposite()const
{
BigInt n(*this);
if (!n.isZero()) n.negative = !n.negative;
return n;
}
BigInt BigInt::absoluteAdd(const BigInt& n)const
{
BigInt bi(*this);
;//进位
; i<MAXBIT; ++i) {
bi.bit[i] = (bit[i] + n.bit[i] + next) % ;
next = (bit[i] + n.bit[i] + next) / ;
}
return bi;
}
BigInt BigInt::absoluteMinus(const BigInt& n)const
{
BigInt bi(*this);
; i>=; --i) {
if (bi.bit[i]>=n.bit[i]) bi.bit[i] -= n.bit[i];
else {//借位
;//借位位
) ++borrow;
--bi.bit[borrow];
; j<borrow; ++j) bi.bit[j] = ;
bi.bit[i] = bi.bit[i] + - n.bit[i];
}
}
return bi;
}
bool BigInt::absoluteEqual(const BigInt& n)const
{
; i<MAXBIT; ++i) {
if (bit[i] != n.bit[i]) return false;
}
return true;
}
bool BigInt::absoluteGreater(const BigInt& n)const
{
; i>=; --i) {
if (bit[i]>n.bit[i]) return true;
else if (bit[i]<n.bit[i]) return false;
}
return false;
}
bool BigInt::absoluteEqualGreater(const BigInt& n)const
{
; i>=; --i) {
if (bit[i]>n.bit[i]) return true;
else if (bit[i]<n.bit[i]) return false;
}
return true;
}
代码调用也挺方便,如下例子:
#include "BigInt.h"
int main()
{
BigInt m = ;
BigInt n("-32143542");
if (m >= n) puts("m >= n");
n = m + n;
n = n * ;
n.print();
;
}
模板写成后特地去poj刷了大数相加和大数相乘两道水题,一次ac的满足感可是杠杠的~
欢迎大家参考,测试,批评指正bug和不足之处,感谢~
---------------------------------------------------------------------------------------------
2014/10/15更新
添加了重载负号,+=,-=,*=,/=,%=,还有string()函数返回值的字符串功能
/*BigInt.h*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXBIT 1007
#define BITTYPE int
class BigInt {
private:
BITTYPE bit[MAXBIT];
bool negative;//负数标志
public:
BigInt(); //默认构造函数,值为0
BigInt(const int); //构造函数
BigInt(const char *); //构造函数
BigInt(const BigInt &); //复制构造函数
/*重载赋值运算符*/
BigInt& operator=(const BigInt&);
BigInt& operator=(const int );
/*重载算数运算符*/
BigInt operator+(const BigInt& )const;
BigInt operator+(const int )const;
BigInt operator+=(const BigInt& );
BigInt operator+=(const int );
BigInt operator-(const BigInt& )const;
BigInt operator-(const int )const;
BigInt operator-=(const BigInt& );
BigInt operator-=(const int );
BigInt operator-( )const;
BigInt operator*(const BigInt& )const;
BigInt operator*(const int )const;
BigInt operator*=(const BigInt& );
BigInt operator*=(const int );
BigInt operator/(const int )const;
BigInt operator/=(const int );
int operator%(const int )const;
BigInt operator%=(const int );
/*重载比较运算符*/
bool operator>(const BigInt& )const;
bool operator>(const int )const;
bool operator>=(const BigInt& )const;
bool operator>=(const int )const;
bool operator<(const BigInt& )const;
bool operator<(const int )const;
bool operator<=(const BigInt& )const;
bool operator<=(const int )const;
bool operator==(const BigInt& )const;
bool operator==(const int )const;
bool operator!=(const BigInt& )const;
bool operator!=(const int )const;
void print() const;//输出数值
char *string() const;//返回数值字符串
bool isZero() const;//是否为0
bool isPositive() const;//是否为正数
bool isNegative() const;//是否为负数
bool nonNegative() const;//是否为非负数
private:
BigInt opposite()const;//取相反数
BigInt absoluteAdd(const BigInt&)const;//加上绝对值
BigInt absoluteMinus(const BigInt&)const;//减去绝对值小于自身的数的绝对值
bool absoluteEqual(const BigInt&)const;//绝对值等于
bool absoluteGreater(const BigInt&)const;//绝对值大于
bool absoluteEqualGreater(const BigInt&)const;//绝对值大于等于
};
BigInt::BigInt()
{
memset(bit,,sizeof(bit));
negative = false;
}
BigInt::BigInt(const int n)
{
memset(bit,,sizeof(bit));
int nn = n;
) negative = false;
else {
negative = true;
nn = -nn;
}
;
while (nn) {
bit[pos++] = nn % ;
nn /= ;
}
}
BigInt::BigInt(const char *s)
{
int len = strlen(s);
bool valid = true;//符合数字格式
) {
]!=]!=])) valid = false;
; i<len; ++i) {
if (!isdigit(s[i])) valid = false;
}
}
) {
])) valid = false;
}
|| !valid) {
memset(bit,,sizeof(bit));
negative = false;
return;
}
, end = len-;
] == '+') {
negative = false;
++beg;
}
] == '-') {
bool zeroFlag = true;
; i<len; ++i) {
') {
zeroFlag = false;
break;
}
}
if (zeroFlag) negative = false;
else negative = true;
++beg;
}
else negative = false;
memset(bit,,sizeof(bit));
for (int i=beg; i<=end; ++i) {
bit[len--i] = s[i] - ';
}
}
BigInt::BigInt(const BigInt& n)
{
memcpy(bit,n.bit,sizeof(bit));
negative = n.negative;
}
BigInt& BigInt::operator=(const BigInt& n)
{
memcpy(bit,n.bit,sizeof(bit));
negative = n.negative;
return *this;
}
BigInt& BigInt::operator=(const int n)
{
return *this = BigInt(n);
}
BigInt BigInt::operator+(const BigInt& n)const
{
if ((!negative && !n.negative) || (negative && n.negative)) {
return this->absoluteAdd(n);
}
else {
if (absoluteEqual(n)) return BigInt();
else if (absoluteEqualGreater(n)) return this->absoluteMinus(n);
else return n.absoluteMinus(*this);
}
}
BigInt BigInt::operator+(const int n)const
{
return *this + BigInt(n);
}
BigInt BigInt::operator+=(const BigInt& n)
{
return *this = *this + n;
}
BigInt BigInt::operator+=(const int n)
{
return *this = *this + n;
}
BigInt BigInt::operator-(const BigInt& n)const
{
return *this + n.opposite();
}
BigInt BigInt::operator-(const int n)const
{
return *this - BigInt(n);
}
BigInt BigInt::operator-=(const BigInt& n)
{
return *this = *this - n;
}
BigInt BigInt::operator-=(const int n)
{
return *this = *this - n;
}
BigInt BigInt::operator-()const
{
BigInt bi(*this);
if (!this->isZero()) bi.negative = !bi.negative;
return bi;
}
BigInt BigInt::operator*(const BigInt& n)const
{
if (isZero() || n.isZero()) return BigInt();
BigInt bi = BigInt();
if ((!negative && !n.negative) || (negative && n.negative)) {
bi.negative = false;
}
else bi.negative = true;
; i<MAXBIT; ++i) ; j<MAXBIT-i; ++j) {
bi.bit[i+j] += bit[i] * n.bit[j];
}
; i<MAXBIT-; ++i) {//进位
bi.bit[i+] += bi.bit[i] / ;
bi.bit[i] %= ;
}
return bi;
}
BigInt BigInt::operator*(const int n)const
{
return *this * BigInt(n);
}
BigInt BigInt::operator*=(const BigInt& n)
{
return *this = *this - n;
}
BigInt BigInt::operator*=(const int n)
{
return *this = *this * n;
}
BigInt BigInt::operator/(const int n)const
{//除以0直接返回0
) return BigInt();
BigInt bi = BigInt();
) || (negative && n<)) {
bi.negative = false;
}
else bi.negative = true;
;//累计除数
; i>=; --i) {
div = div * + bit[i];
bi.bit[i] = div / n;
div %= n;
}
return bi;
}
BigInt BigInt::operator/=(const int n)
{//除以0直接返回0
) return BigInt();
else return *this = *this / n;
}
int BigInt::operator%(const int n)const
{
;//累计余数
; i>=; --i) {
//mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n;
mod = ((mod*) + bit[i]) % n;
}
return mod;
}
BigInt BigInt::operator%=(const int n)
{
;//累计余数
; i>=; --i) {
//mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n;
mod = ((mod*) + bit[i]) % n;
}
return *this = BigInt(mod);
}
bool BigInt::operator>(const BigInt& n)const
{
if (!negative && n.negative) return true;
else if (negative && !n.negative) return false;
else if (!negative && !n.negative) return absoluteGreater(n);
else return n.absoluteGreater(*this);
}
bool BigInt::operator>(const int n)const
{
return *this > BigInt(n);
}
bool BigInt::operator>=(const BigInt& n)const
{
if (!negative && n.negative) return true;
else if (negative && !n.negative) return false;
else if (!negative && !n.negative) return absoluteEqualGreater(n);
else return n.absoluteEqualGreater(*this);
}
bool BigInt::operator>=(const int n)const
{
return *this >= BigInt(n);
}
bool BigInt::operator<(const BigInt& n)const
{
return n > *this;
}
bool BigInt::operator<(const int n)const
{
return *this < BigInt(n);
}
bool BigInt::operator<=(const BigInt& n)const
{
return n >= *this;
}
bool BigInt::operator<=(const int n)const
{
return *this <= BigInt(n);
}
bool BigInt::operator==(const BigInt& n)const
{
if (negative != n.negative) return false;
; i<MAXBIT; ++i) {
if (bit[i] != n.bit[i]) return false;
}
return true;
}
bool BigInt::operator==(const int n)const
{
return *this == BigInt(n);
}
bool BigInt::operator!=(const BigInt& n)const
{
if (negative != n.negative) return true;
; i<MAXBIT; ++i) {
if (bit[i] != n.bit[i]) return true;
}
return false;
}
bool BigInt::operator!=(const int n)const
{
return *this != BigInt(n);
}
void BigInt::print()const
{
if (negative) printf("-");
;
; --pos) {
if (bit[pos]) break;
}
; --i) printf("%d",bit[i]);
}
char *BigInt::string()const
{
];
;
if (negative) content[posi++] = '-';
;
; --pos) {
if (bit[pos]) break;
}
//printf("pos = %d\n",pos);
; --i) {
content[posi++] = bit[i] + ';
//printf("bit[%d] = %d\n",i,bit[i]);
}
content[posi] = '\0';
return content;
}
bool BigInt::isZero()const
{
bool zeroFlag = true;
; i<MAXBIT; ++i) {
) {
zeroFlag = false;
break;
}
}
return zeroFlag;
}
bool BigInt::isPositive()const
{
return !negative && !isZero();
}
bool BigInt::isNegative()const
{
return negative;
}
bool BigInt::nonNegative()const
{
return !negative;
}
BigInt BigInt::opposite()const
{
BigInt n(*this);
if (!n.isZero()) n.negative = !n.negative;
return n;
}
BigInt BigInt::absoluteAdd(const BigInt& n)const
{
BigInt bi(*this);
;//进位
; i<MAXBIT; ++i) {
bi.bit[i] = (bit[i] + n.bit[i] + next) % ;
next = (bit[i] + n.bit[i] + next) / ;
}
return bi;
}
BigInt BigInt::absoluteMinus(const BigInt& n)const
{
BigInt bi(*this);
; i>=; --i) {
if (bi.bit[i]>=n.bit[i]) bi.bit[i] -= n.bit[i];
else {//借位
;//借位位
) ++borrow;
--bi.bit[borrow];
; j<borrow; ++j) bi.bit[j] = ;
bi.bit[i] = bi.bit[i] + - n.bit[i];
}
}
return bi;
}
bool BigInt::absoluteEqual(const BigInt& n)const
{
; i<MAXBIT; ++i) {
if (bit[i] != n.bit[i]) return false;
}
return true;
}
bool BigInt::absoluteGreater(const BigInt& n)const
{
; i>=; --i) {
if (bit[i]>n.bit[i]) return true;
else if (bit[i]<n.bit[i]) return false;
}
return false;
}
bool BigInt::absoluteEqualGreater(const BigInt& n)const
{
; i>=; --i) {
if (bit[i]>n.bit[i]) return true;
else if (bit[i]<n.bit[i]) return false;
}
return true;
}
ACM大数模板(支持正负整数)的更多相关文章
- 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...
- hdu1042(大数模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 在网上找了个大数模板方便以后用得到. #include<iostream> #inc ...
- HDU 1134 Game of Connections(卡特兰数+大数模板)
题目代号:HDU 1134 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 20 ...
- bignum 大数模板
今天无意间看到一个很好的大数模板,能算加.减.乘.除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减.我借用 ...
- c++大数模板
自己写的大数模板,参考了小白书上的写法,只是实现了加减乘法,不支持负数,浮点数.. 除法还没写o(╯□╰)o以后再慢慢更吧.. 其实除法我用(xie)的(bu)少(lai),乘法写过fft,这模板还是 ...
- 大数模板 poj3982
1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就 ...
- Hdu 4762 网络赛 高精度大数模板+概率
注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...
- vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)
P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状 ...
- 让ecshop模板支持php运算
让ecshop模板支持php运算在 cls_template.php 底部加入函数: /** * 处理if标签 * * @access public * @param string $tag_args ...
随机推荐
- 运维人员:走好你的IT运维路
转自 http://os.51cto.com/art/201303/387120.htm 现阶段,大多数运维人员只是处于被动低效率手工救火的状态,企业对其重视程度不高,导致部分运维人员对自己的 ...
- PHP框架学习之Laravel基本功能
Laravel5的功能不是一般的多(路由,中间件,blade模版...),单是一个路由功能就让哥很蛋疼,虽说路由使用起来变得很灵活,但真他妹的有点变态了.这里是我照着Laravel5官方文档研究的成果 ...
- PHP开发调试环境配置
——基于wamp和Eclipse for PHP Developers 引言 为了搭建PHP开发调试环境,我曾经在网上查阅了无数的资料,但没有一种真正能够行的通的.因为PHP开发环境需要很多种软件相互 ...
- PHP学习日记(一)——类、函数的使用
一.自定义函数 function add($a,$b){ $c=$a+$b; echo 'add test:'; echo $c; return $c; } add(1,2); 输出结果: add t ...
- MVC in Javascript
MVC in Javascript From http://www.cnblogs.com/tugenhua0707/p/5156179.html 原博的比我详细 我是以自己的惯用的方式实现了一下 M ...
- 有关于/home出现100%被占用 与 vnc的关系
我在远程服务器时,通常使用的程序是vnc.因为vnc可以图形化界面,操作效果比用putty好很多. 但是,我发现使用vnc有一个问题,就是/home占用空间会达到100%. [zy@islab62 ~ ...
- C++箴言:理解 new-handler的行为
当 operator new 不能满足一个内存分配请求时,它抛出一个 exception(异常).很久以前,他返回一个 null pointer(空指针),而一些比较老的编译器还在这样做.你依然能达到 ...
- Windows Azure 社区新闻综述(#68 版)
欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 在 Windows Az ...
- 客户端浏览器判断(ios .android)
在开发工程中,我们可能需要判断客户端浏览器的版本而作相应的处理:通常做法是通过浏览器的userAgent去判断浏览器版本,故在此总结下,方便以后使用. <script type="te ...
- POJ3322-经典的游戏搜索问题
临近毕业真是各种琐事多,好不容易写完几万字蛋疼的论文,又接着户口档案挂靠,毕业旅游,20多个离校盖章,签证被check了几个星期还没消息,希望8月初能走啊. 各种事情之下,人就是懒加心散,好久没写代码 ...