算法笔记(3)—— 快速 I/O 算法:快速输入算法、快速输出算法

简介: 算法笔记(3)—— 快速 I/O 算法:快速输入算法、快速输出算法

快速输入算法

【内置函数速度比较】

std::cin < scanf < getchar

getchar 是最快的,其速度大约为 cin 的 10 倍,然后是 scanf,最后是 cin,原因也很简单,


cin 需要判断输入数据的类型,智能地输入数据,其中,智能识别需要消耗大量时间;(较慢)


scanf 虽不需要智能识别,可它有一个格式化的过程,要识别格式化字符串,需要消耗部分时间;(一般)


getchar 没有什么特殊的过程,直接接收一个字符,几乎不消耗时间;(较快)

因此我们的快速输入算法就是基于 getchar 实现的

【快速输入整数】

函数所需头文件

【C】stdio.h、ctype.h

【C++】iostream

#define int long long //精度提高方法


inline void getint(int &n)//快速输入整数函数
//n:引用的变量
{
  bool b=false;//负号判断变量
  char c=getchar();
  while(isspace(c))c=getchar();//空格字符直接跳过
  if(c==45)b=true,c=getchar();//添加负号标记
  if(isdigit(c))n=0;//初始化为 0
  while(true)
  {
    if(isdigit(c))//判断是否为数字字符
    {
      n*=10;
      n+=c-48;
      c=getchar();
    }
    else break;
  }
  n=b?-n:n;//改变符号
}

【快速输入浮点数】

函数所需头文件

【C】stdio.h、ctype.h

【C++】iostream

#define float double //精度提高方法
inline void getfloat(float &n)//快速输入浮点数函数(兼容整数)
//n:引用的变量
{
  float f=1.;//小数
  bool b=false,p=false;//负号判断变量、小数点判断变量
  char c=getchar();
  while(isspace(c))c=getchar();//空格字符直接跳过
  if(c==45)b=true,c=getchar();//添加负号标记
  if(isdigit(c))n=0.;//初始化为 0
  while(true)
  {
    if(!p&&c==46)p=true,c=getchar();//小数点存在
    if(isdigit(c))//判断是否为数字字符
    {
      (!p)?n*=10:f*=10;
      n+=float(c-48)/f;
      c=getchar();
    }
    else break;
  }
  n=b?-n:n;//改变符号
}

快速输出算法

【内置函数速度比较】

std::cout < printf < putchar

putchar 是最快的,其速度大约为 cout 的 10 倍,然后是 printf,最后是 cout,原因也很简单,


cout 需要判断输出数据的类型,智能地输出数据,其中,智能识别需要消耗大量时间;(较慢)


printf 虽不需要智能识别,可它有一个格式化的过程,要识别格式化字符串,需要消耗部分时间;(一般)


putchar 没有什么特殊的过程,直接输出一个字符,几乎不消耗时间;(较快)

因此我们的快速输出算法就是基于 putchar 实现的

【快速输出整数】

函数所需头文件

【C】stdio.h

【C++】iostream

#define int long long //精度提高方法
inline void putint(int &n)//快速输出整数函数
//n:引用的变量
{
  int num=0;
  if(n<0)putchar(45);//输出负号
  n=n<0?-n:n;//取正数
  while(n)//翻转数字 n
  {
    num*=10;
    num+=n%10;
    n/=10;
  }
  while(num)//输出
  {
    putchar(48+num%10);
    num/=10;
  }
}

【快速输出浮点数】

函数所需头文件

【C】stdio.h、math.h

【C++】iostream、cmath

#define float double //精度提高方法

inline void putfloat(float &n,int p)//快速输出浮点数函数
//n:引用的变量 p:保留小数点的位数
{
  long long num=0,key;
  if(n<0)putchar(45);//输出负号
  n=n<0?-n:n;//取正数
  key=n*pow(10,p);//小数部分化为整数
  n=0;//归为 0,便于后续使用 
  while(key)//翻转数字 n
  {
    num*=10;
    num+=key%10;
    key/=10;
    n++;
  }
  while(num)//输出
  {
    if(p+key++==n)putchar(46);
    putchar(48+num%10);
    num/=10;
  }
}


目录
相关文章
|
4月前
|
算法
计算机算法设计与分析(1-6章 复习笔记)
计算机算法设计与分析(1-6章 复习笔记)
|
4月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
4月前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
45 1
|
4月前
|
机器学习/深度学习 算法 BI
机器学习笔记(一) 感知机算法 之 原理篇
机器学习笔记(一) 感知机算法 之 原理篇
|
4月前
|
算法 Java 索引
12.12_黑马数据结构与算法笔记Java
12.12_黑马数据结构与算法笔记Java
34 1
|
3月前
|
存储 算法 C语言
软考中级之数据库系统工程师笔记总结(二)数据结构与算法
软考中级之数据库系统工程师笔记总结(二)数据结构与算法
25 0
|
3月前
|
存储 算法 程序员
|
4月前
|
机器学习/深度学习 算法 数据可视化
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
37 0
|
4月前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
63 0
|
4月前
|
存储 人工智能 算法
程序与技术分享:Acwing算法笔记
程序与技术分享:Acwing算法笔记