1. 程式人生 > >快速輸入輸出類(C++)

快速輸入輸出類(C++)

        我們知道,cin/cout是很慢的,所以我們經常scanf/printf。但是如果要求更嚴格一些,速度要更快,該怎麼辦呢?有一種解決辦法,那就是——快速輸入輸出。

        快速輸入輸出採用getchar()和putchar()函式,用了數字累加的方法輸入/輸出數。

        我們也可以把快速輸入輸出定義成類,就像cin/cout一樣。

程式碼如下:

//qio.h
#ifndef MY_QIO_H
#define MY_QIO_H
#include<cstdio>
#include<cmath>
#define E_MINUS(i) pow(0.1,i)
#define E_PLUS(i) pow(10,i);
using std::getchar;
using std::pow;
using std::putchar;
//assistant function(al)s
struct precision_class{
	struct prec_type{
		int prec;
	};
	prec_type operator () (int precision__){
		prec_type ans={precision__};
		return ans;
	}
}precision; 
//qin
class q_istream{
	public:
	q_istream operator >> (int &int_num){
		int_num=0;
		bool is_nag=0;
		for(int i=0;;++i){
			char c=getchar();
			if(c==' '||c=='\t'||c=='\n'||c==EOF) break;
			if(i==0 && c=='-'){
				is_nag=1;
				continue;
			} 
			if(i==0 && c=='+') continue;
			int_num*=10;
			int_num+=c-48;
		}
		if(is_nag) int_num=-int_num;
		return *this;
	}
	q_istream operator >> (long long &long_long_num){
		long_long_num=0;
		bool is_nag=0;
		for(int i=0;;++i){
			char c=getchar();
			if(c==' '||c=='\t'||c=='\n'||c==EOF) break;
			if(i==0 && c=='-'){
				is_nag=1;
				continue;
			} 
			if(i==0 && c=='+') continue;
			long_long_num*=10;
			long_long_num+=c-48;
		}
		if(is_nag) long_long_num=-long_long_num;
		return *this;
	}
	q_istream operator >> (unsigned long long &unsigned_long_long_num){
		unsigned_long_long_num=0;
		bool is_nag=0;
		for(int i=0;;++i){
			char c=getchar();
			if(c==' '||c=='\t'||c=='\n'||c==EOF) break;
			unsigned_long_long_num*=10;
			unsigned_long_long_num+=c-48;
		}
		if(is_nag) unsigned_long_long_num=-unsigned_long_long_num;
		return *this;
	}
	q_istream operator >> (double &double_num){
		double_num=0;
		bool is_nag=0;
		for(int i=1;;++i){
			char c=getchar();
			if(c=='.') break;
			if(i==1 && c=='-'){
				is_nag=1;
				continue;
			} 
			if(i==1 && c=='+') continue;
			double_num*=10;
			double_num+=c-48;
		}
		for(int i=1;;++i){
			char c=getchar();
			if(c==' '||c=='\t'||c=='\n'||c==EOF) break;
			double_num+=E_MINUS(i)*(c-48);
		}
		if(is_nag) double_num=-double_num;
		return *this;
	}
}qin;
//qout
class q_ostream{
	private:
	int precision;
	public:
	q_ostream(){
		precision=4;
	}
	q_ostream operator << (int int_num){
		char arr[20];
		int i=0;
		if(int_num<0) putchar('-'),int_num=-int_num;
		while(int_num>0){
			arr[i++]=(int_num%10+48);
			int_num/=10;
		}
		while(i>0){
			putchar(arr[--i]);
		}
		return *this;
	}
	q_ostream operator << (long long long_long_num){
		char arr[30];
		int i=0;
		if(long_long_num<0) putchar('-'),long_long_num=-long_long_num;
		while(long_long_num>0){
			arr[i++]=(long_long_num%10+48);
			long_long_num/=10;
		}
		while(i>0){
			putchar(arr[--i]);
		}
		return *this;
	}
	q_ostream operator << (double double_num){
		if(double_num<0) putchar('-'),double_num=-double_num;
		int int_num=double_num;
		if(int_num){
			char arr[20];
			int i=0;
			if(int_num<0) putchar('-'),int_num=-int_num;
			while(int_num>0){
				arr[i++]=(int_num%10+48);
				int_num/=10;
			}
			while(i>0){
				putchar(arr[--i]);
			}
		}
		else putchar('0');
		int_num=double_num;
		if(double_num-int_num<=E_MINUS(precision)) return *this;
		putchar('.');
		long long long_long_num=(double_num-int_num)*E_PLUS(precision);
		{
			char arr[30];
			int i=0;
			while(long_long_num>0){
				int num_10=long_long_num%10;
				arr[i++]=(num_10+48);
				long_long_num/=10;
			}
			bool bef0=1;
			while(i>0){
				putchar(arr[--i]);
			}
		}
		return *this;
	}
	q_ostream operator << (precision_class::prec_type precision_num){
		precision=precision_num.prec;
		return *this;
	}
}qout; 
#endif

        其實,快速輸出並不快,甚至比cout還要慢。

        現在可以快速地輸入一個數了!

 

 

        ——但是,你們測試了嗎?你們有沒有發現qout輸出浮點數有點問題?因為qout輸出浮點數最後一位是用去尾法輸出的,所以會有問題!有時候,由於精度的原因,原來的數(比如1.23)會減一點點,可能只有1e-12,但是因為是去尾法,結果就變成了1.2299。如果是1.2345,那就有可能變成1.2344。所以——互動來了!在評論區中回覆q_ostream operator << (double double_num)的改進方案(C++程式碼),測試通過(系統:Windows,IDE:Dev-C++,編譯器:g++)的就會有獎勵:如果你寫了文章(原創/轉載/翻譯均可),那麼我會在幾篇文章(最多3篇,如果文章數量不夠3篇,那麼我會全點贊)中點贊。(截止時間:2018年12月31日23:59)

 

好,我最後說一下使用方法

  • 一般按cin/cout的方式,如 int a; qin>>a;
  • 如果輸出需要小數精度控制,用 qout<<precision(精度) 來調整精度。

 

只許轉載程式碼和使用方法。(互動部分不許轉載!)轉載時請附上本文連結: https://blog.csdn.net/weixin_41461277/article/details/84863301 。