【ACM】编程笔记

1. 编译错误

1. Windows下GCC编译环境中文乱码

原因: Windows(中文)默认的字符集是Windows-936(GBK),而GCC编译器默认编译的时候是按照UTF-8解析的,当未指定字符集时一律当作UTF-8进行处理,于是造成乱码

// 在编译参数中增加以下两条指令:
-fexec-charset=gbk
-finput-charset=gbk

新增: 上述方法只有在只使用 cout 输出时有效。若要使得 printf 和 cout 输出中文均能正常显示,需把 cmd 的命令显示改为 UTF8

chcp 65001

2. Java中编译错误: 编码GBK的不可映射字符

 javac -encoding utf-8 JAVA_FILE_NAME.java && java JAVA_FILE_NAME

2. Java

Java中 String 和 Integer 的相互转换

// 将字符串 String 转换成整数 int。
1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]);
2). int i = Integer.valueOf(my_str).intValue();
// 将整数 int 转换成字符串 String
1.) String s = String.valueOf(i);
2.) String s = Integer.toString(i);
3.) String s = "" + i;

3. C/C++

C++ 中 int 和 string 的相互转换

// int 转 string
string Int_to_String(int n) {
    ostringstream ss;
    ss<<n; //n为int类型
    return ss.str();
}
// string 转 int
int str2int(string str) {
    istringstream ss(str);
    int res;
    ss>>res;
    return res;
}

cin cout 加速

cin、cout慢是因为: 默认的时候, c i n cin cin s t d i n stdin stdin 总是保持同步的,也就是说 s c a n f scanf scanf c i n cin cin 两种方法可以混用,而不必担心文件指针混乱,同时 c o u t cout cout s t d o u t stdout stdout 也一样,两者混用不会输出顺序错乱。也正因为这个兼容性的特性,导致许多额外的开销。
解决方法:sync_with_stdio()这个函数是一个“是否兼容stdio”的开关, f a l s e false false 关闭所有C++标准流与其相应标准C流的同步。
进一步加速(接近scanf): 在默认的情况下 c i n cin cin 绑定的是 c o u t cout cout(cin.tie() == &cout),调用 c i n > > a ; cin>>a; cin>>a; 导致 c o u t cout cout 刷新。通过调用 cin.tie(0)解除 c i n cin cin c o u t cout cout 的绑定 , c i n cin cin 读数据将不再导致 c o u t cout cout 刷新。

ios::sync_with_stdio(false);
cin.tie(0);

C/C++快速读写

整数

#include<cctype>
inline int read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
inline void write(int x)
{
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}

浮点

inline double dbread()
{
    double X=0,Y=1.0; int w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=X*10+(ch^48),ch=getchar();
    ch=getchar();//读入小数点
    while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();
    return w?-X:X;
}

4. 经典问题

1. 一维线段是否有交集问题

线段 (a1,a2) 和 (b1,b2) 是否有交集,根据数学知识我们可以知道,当 min(a2, b2) > max(a1, b1) 时,这两条线段有交集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值