用getchar()和putchar()加速IO(含整型快速IO和浮点型快速IO)

STM32 printf 系统调用 #ifdef __GNUC__ /* With GCC, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GN 阅读详情

****转载请注明http://blog.youkuaiyun.com/synapse7/article/details/19096049****

概述:使用getchar()和putchar(),以及math.h头文件中的一些函数,基本实现了以下函数

scanf("%u",&x)

scanf("%d",&x)

scanf("%lf",&x)

printf("%u",x)

printf("%d",x)

printf("%f",x)

printf("%*f",precision,x)

printf("%s",str)


PS:输入函数在读取输入时要多读一个字符(比如数字后面的空格或换行)以便判断是否读完字符。

但scanf没有多读一个字符(把那个字符返回到输入流了),所以若想再实现的与scanf更像的话,可在函数返回前加上

ungetc(c, stdin); ///把字符c放回到标准输入流(键盘)  

PS2:函数实现我用的引用,可以把函数参数改为int *x,同时使用函数时传入的参数为&x,这样便与scanf更近了一步。

PS3:由于在实际使用中只在读取整数时用到了返回值,可根据需要在函数中添加返回值 (-1,0,1) 。


完整代码:

#include <stdio.h>
#include <ctype.h>
#include <math.h>
const double dten[10] = {0, 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8, 1e-9};
///一般题目至多要求输出小数点后6位,此数组足矣。

char outputbuf[15]; /// 声明成全局变量可以减小开销

/*
    读非负整数
    返回值:若成功读到一个整数返回true,若读到EOF返回false
*/
inline bool unsigned_input(int& x)
{
	char c;
	while (!isdigit(c = getchar()))
		if (c == EOF) return false;
	x = 0;
	while (isdigit(c))
	{
		x = x * 10 + (c & 15);
		c = getchar();
	}
	return true;
}

/*
    读整数
    注意-0的输出为0
    返回值:若成功读到一个整数返回true,若读到EOF返回false
*/
inline bool input(int& x)
{
	char c;
	while ((c = getchar()) != '-' && !isdigit(c))
		if (c == EOF) return false;
	bool neg = false;
	if (c == '-')
		x = 0, neg = true;
	else
		x = c & 15;
	while (isdigit(c = getchar()))
		x = x * 10 + (c & 15);
	if (neg) x = -x;
	return true;
}

/*
    读正负浮点、零(也可以读整数)
    注意无法判断".14"这样的输入
    注意-0.00这样的输入使得x=-0.000000
    返回值:none
*/
inline void input(double& x)
{
	char c;
	while ((c = getchar()) != '-' && !isdigit(c))
		;
	bool neg = false;
	if (c == '-')
		x = 0, neg = true;
	else
		x = c & 15;
	while (isdigit(c = getchar()))
		x = x * 10 + (c & 15);
	if (c == '.')
	{
		double ten = 1.0;
		while (isdigit(c = getchar()))
			x += (c & 15) * (ten /= 10);
	}
	if (neg) x = -x;
}

/*
    读正负浮点、零(也可以读整数)
    并且可以判断".14"这样的输入
    注意-0.00这样的输入使得x=-0.000000
    返回值:none
*/
inline void special_input(double& x)
{
	char c;
	while ((c = getchar()) != '-' && c != '.' && !isdigit(c))
		;
	bool neg = false;
	if (c == '-')
	{
		neg = true;
		c = getchar();
	}
	x = 0;
	if (c != '.')
	{
		// 整数部分
		x = c & 15;
		while (isdigit(c = getchar()))
			x = x * 10 + (c & 15);
	}
	if (c == '.')
	{
		// 小数部分
		double ten = 1.0;
		while (isdigit(c = getchar()))
			x += (c & 15) * (ten /= 10);
	}
	if (neg) x = -x;
}

/*
    输出非负整数
    返回值:none
*/
inline void unsigned_output(int x)
{
	if (x == 0)
		putchar('0');
	else
	{
		int p = 0;
		while (x)
		{
			outputbuf[p++] = x % 10;
			x /= 10;
		}
		for (int i = p - 1; i >= 0; i--)
			putchar('0' + outputbuf[i]); // 逆序输出
	}
}

/*
    输出整数
    返回值:none
*/
inline void output(int x)
{
	if (x == 0)
		putchar('0');
	else
	{
		if (x < 0)
		{
			x = -x;
			putchar('-');
		}
		int p = 0;
		while (x)
		{
			outputbuf[p++] = x % 10;
			x /= 10;
		}
		for (int i = p - 1; i >= 0; i--)
			putchar('0' + outputbuf[i]); // 逆序输出
	}
}

/*
    输出精度为precision的浮点数(四舍五入),对-0.0输出0.000000
    如果precision为0,则只输出离x最近的整数
    返回值:none
*/
inline void output(int precision, double x)
{
	if (x < 0)
	{
		x = -x;
		putchar('-');
	}
	if (precision)
	{
		// 整数部分
		double intpart;
		x = modf(x, &intpart); // from <math.h>
		unsigned_output((int)intpart);
		//小数部分
		putchar('.');
		for (int i = 1; i < precision && x < dten[i]; ++i)
			putchar('0');// 输出小数点后有多少0
		int ten = 1;
		while (precision--)
			ten *= 10;
		unsigned_output((int)round(x * ten));
	}
	else
		unsigned_output((int)round(x));
}

/*
    输出精度为precision的浮点数(四舍五入),对-0.0输出-0.000000
    如果precision为0,则只输出离x最近的整数
    返回值:none
*/
inline void exact_output(int precision, double x)
{
	if (signbit(x)) // from <math.h>, return true if the sign of x is negative(就相当于返回x的符号位)
	{
		x = -x;
		putchar('-');
	}
	if (precision)
	{
		// 整数部分
		double intpart;
		x = modf(x, &intpart); // from <math.h>
		unsigned_output((int)intpart);
		//小数部分
		putchar('.');
		for (int i = 1; i < precision && x < dten[i]; ++i)
			putchar('0');// 输出小数点后有多少0
		int ten = 1;
		while (precision--)
			ten *= 10;
		unsigned_output((int)round(x * ten));
	}
	else
		unsigned_output((int)round(x));
}

/*
    输出精度为6的浮点数(四舍五入),对-0.0输出0.000000
    返回值:none
*/
inline void output(double x)
{
	output(6, x);
}

/*
    输出精度为6的浮点数(四舍五入),并且对-0.0输出-0.000000
    注意:按IEEE 754标准,-0.0和0.0在输出上是有区别的,但是二者实际上是相等的
    返回值:none
*/
inline void exact_output(double x)
{
	exact_output(6, x);
}

/*
    打印字符串str
    返回值:none
*/
inline void output(char *str)
{
	while (*str) putchar(*str++);
}

int main(void)
{
	int t;
	double x;
	unsigned_input(t);
	while (t--)
	{
		input(x);
		output(x);
		putchar(10);
		exact_output(x);// same as printf("%f",x);
		putchar(10);
	}
	return 0;
}

C++加速读取和其他加速   标题输入函数对比模板: std::ios::sync_with_stdio(false);//关闭同步后据说不能和C的输入输出混用,出玄学问题 std::cin.tie(0); cout&lt;&lt;'\n'; for(register int i=0;i&lt;n;i++) 要点: 1,fread,read,mmap不是很常用的函数,比较难写,竞赛中一般使用不到,常用的是scan... 阅读详情

相关推荐

C++“读取“大量数据时--快读

在一些算法题目中中,有的程序会被卡常数,就是说,程序虽然时间复杂度可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时。这是,快读就显得尤为重要了。 当然,如果程序算法本身就不高效,快读就更加重要了,可以让一些暴力程序获得更多的测试点分数,如果数据不大甚至能AC,此时快读就是“得分法宝”. 在默认情况下, std::cin/std::cout 是极为迟缓的读入/输出方式,而 scanf/printf 比 std::cin/std::cout 快得多。 可是为什么会这样呢?有没有什么办法解决读

我不是码农的博客~~~ 2794

getchar用法例子java,C语言输入和输出(getchar() 、 putchar() 、gets() 、 puts()、scanf() 、printf())...

1、输入输出函数C语言中stdio.h头文件中内置输入输出函数,如下列出:printf 与 scanfgetchar 与 putchargets 与puts输入输出函数中 scanf与printf功能比较丰富,但操作稍微复杂。2、scanf() 和 printf() 函数int scanf(const char *format, ...) 函数从标准输入流 stdin 读取输入,并根据提供的 fo...

weixin_36460310的博客 761

初识数据结构之入门必懂——线性表(顺序表)

本文将介绍数据结构中的线性表与线性表中最简单的结构——顺序表

m0_64705485的博客 905

在c++中,get、gets、getchar、scanf的异同

get、gets、getchar、scanf之间的区别

qq_46871669的博客 2435

Python 静态导入与动态导入

python中模块的静态导入 与 动态导入(运行时指定模块),以及具体对应示例。

慢也好,步子小也好,往前走就好~ 717

SLUB DEBUG 检测slab 内存泄漏

文章介绍如何定位linux 内核中slab 内存泄漏。

一叶知秋的博客 1491

什么玩意?快读快写浮点型数据?

我下午花了一个小时写了一个什么玩意?居然能过poj1064 Cable master?大家都知道有整型数据快读快写.如下://我写的比较骚.这么写比较简单,仅限非负整数. inline int read() { int x=0;char c=getchar(); for (;!isdigit(c);c=getchar(); for (;isdigit(c);c=getchar()) x=x*10+c

Fuko_Ibuki的博客 1万+

手搓ZLMediaKit实现拉流推流系列3(RK3588上YOLO系列拉流、MPP解码+编码、推流全流程)

 前段时间比较忙,一直没有时间补充后续的内容。今天终于抽出空来,立马进入码字环节:手搓ZLMediaKit实现拉流推流系列在本篇也终于迎来了完结篇,在本篇文章中,你将看到以下一整套完整流程:使用ZLMediaKit拉流---MPP解码---Yolo模型进行推理---MPP编码并推流。

m0_46303486的博客 2174

2.标准IO的字符输入和输出

2 fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。2遇到这种错误:Bad file descriptor, 很可能是文件打开的模式错误(只读模式去写,只写模式去读)2 tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)成功时返回读取的字符;遇到’\n’或已输入size-1个字符时返回,总是包含’\0’文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

不会编程喵的博客 618

通达信【雷霆尊者排序】实战指南:高胜率竞价指标解析与优化策略

本文详细解析了通达信【雷霆尊者排序】指标在集合竞价阶段的应用,提供从基础设置到实战解码的完整指南。文章重点剖析了‘雷霆’、‘使者’、‘精选’等核心信号的逻辑与共振策略,并分享了如何结合K线、市场情绪进行综合研判与风险控制,旨在帮助短线交易者提升早盘选股效率与胜率。

pear55的博客 951

uniapp - H5人脸识别认证与活体检测功能(纯前端免费方案+微信sdk人脸识别)完整源码,微信公众号网页/h5端人脸识别功能人脸核身(微信方案提供后端spring boot+thinkphp源码

uniapp实现人脸认证,uniAPP h5手机拍照+人脸识别,免费人脸识别插件,前端人脸识别解决方案,uniapp H5人脸识别带前后摄像头,人脸识别在H5页面进行采集,微信公众号H5人脸核身,H5端人脸识别功能实现,免费h5人脸识别插件方案,微信公众号H5网页实现人脸识别,uniapp人脸监测,uniapp人脸生物监测,使用uniapp开发H5人脸采集功能/人脸识别功能,uniapp项目—h5端人脸采集功能实现,uniapp vue3人脸核身,H5活体检测认证,人脸认证张嘴摇摇头指引动作,人脸核身 微信

🏆 前端领域优质创作者 3809

算法竞赛C++常用技巧——输入输出优化(防止TLE)

cin、cout优化 在默认情况下,std::cin/std::cout 是极为迟缓的输入/输出方式,而 scanf/printf 比 std::cin/std::cout 快得多。 可是为什么会这样呢?如果我更习惯使用C++的输出方式,那么有没有什么办法解决输入输出缓慢的问题呢? 这是因为在默认情况下,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。由于这个特性,所以导致cin和cout有许多额外的开销。

pursuit的博客 8659

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1283

c++加速方法大全

我们平常写代码的时候,经常超时,非常难受,所以,我写了这篇文章,让你的代码提升速度(这些方法作者亲测有效,用了这些方法,足足提升了1秒!虽然最后题目还是没过)

ptyz306的博客 9810

【首发独家】华为OD机试 - 服务中心选址、服务中心的最佳位置(C 语言解题)

最近更新的博客 华为 od 2023 | 什么是华为 od,od 薪资待遇,od 机试题清单 华为 OD 机试真题大全,用 Python 解华为机试题 | 机试宝典 【华为 OD 机试】全流程解析+经验分享,题型分享,防作弊指南 华为 od 机试,独家整理 已参加机试人员的实战技巧 本篇华为 OD 机试题解:服务中心选址、服务中心的最佳位置

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++为什么空格无法输出_算法竞赛C++常用技巧——输入输出优化(防止TLE)

cin、cout优化在默认情况下,std::cin/std::cout 是极为迟缓的输入/输出方式,而 scanf/printf 比 std::cin/std::cout 快得多。可是为什么会这样呢?如果我更习惯使用C++的输出方式,那么有没有什么办法解决输入输出缓慢的问题呢?这是因为在默认情况下,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时...

weixin_39972567的博客 756

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ 读入/输出优化

优化输入输出

_Gion 1316

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

卡常神器——register 与 快速读入输出

快速读入模板 int read() { int s = 0, w = 1; char ch = getchar(); //getchar() 一次从键盘读入一个字符 while (ch <='0' || ch > '9') { if (ch == '-') w = -1; ch = getchar(); } whi...

weixin_30448603的博客 317

alv界面允许数字输入负号_算法竞赛C++常用技巧——输入输出优化(防止TLE)

cin、cout优化在默认情况下,std::cin/std::cout 是极为迟缓的输入/输出方式,而 scanf/printf 比 std::cin/std::cout 快得多。可是为什么会这样呢?如果我更习惯使用C++的输出方式,那么有没有什么办法解决输入输出缓慢的问题呢?这是因为在默认情况下,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时...

weixin_32829465的博客 237

【C++基础】常见输入输出

C++中常见的输入输出,供于参考。

2503_91588017的博客 514

输入输出优化——防止TLE

输入输出优化

m0_63975263的博客 803

快速输入输出

当程序有大量的数据输入输出时,以下函数可以更加快速(针对整数--其他数据类型同理) char buffer[10]; 10 void print_d( int x ) 11 { 12 if ( x == 0 ) 13 { 14 putchar('0'); 15 } 16 else 17 { 18 int

zhuzhuxia 556

Tip_读入输出优化

char buf[MAXN],*ps=buf,*pe=ps+1; inline void rnext(){//读优 if(++ps==pe) pe=(ps=buf)+fread(buf,1,sizeof(buf),stdin); }inline int in(int x=0,char ch=getchar(),int v=1){ while(ch!='-'&&(ch

BeiYu 624

读写挂模板

有一些极端情况,用scanf会超时,用putchar   1.读数字(int) int read(int &amp;x){     int f=1;char ch;x=0;     do{ch=getchar();if(ch=='-')f=-1;}while(ch&lt;'0'||'9'&lt;ch);//读入符号或其他字符     while('0'&lt;=ch&amp;&amp;...

pcfbyssz的博客 244

别再傻傻用scanf了!C++刷题时用这两行代码,cin/cout速度直接起飞

本文揭秘C++竞赛中提升cin/cout性能的两行关键代码:ios::sync_with_stdio(false)和cin.tie(nullptr)。通过关闭与C标准库的同步及解除输入输出绑定,可大幅提升IO速度,特别适合处理1e6级别的大规模数据输入,帮助算法竞赛选手避免TLE问题。

weixin_30325971的博客 509

C标准库数学计算与文件操作深度解析:从math.h到io.h的实战指南

在C语言编程中,标准库函数是连接应用程序与操作系统底层功能的核心桥梁,其设计哲学深刻影响着代码的性能与健壮性。理解其原理,首先要掌握浮点数处理与错误检测机制,这直接关系到数值计算的精度与稳定性。现代C库通过fpclassify等分类宏进行高效错误检查,替代了传统的errno方式,提升了多线程环境下的安全性。在文件系统交互层面,目录遍历与二进制文件处理是系统编程的常见需求,涉及平台相关的API调用与可移植性设计。这些技术共同支撑了高性能数值计算核心与高效系统工具的构建。本文聚焦于math.h数学函数库的浮点数

weixin_34364071的博客 298
上一篇: POJ 3304 Segments (判断直线和线段是否相交)
下一篇: UVa 10902 / POJ 2653 Pick-up Sticks (线段与线段相交)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值