C++int、long、long long等不同数据类型取值范围
unsigned int 0~4294967295
int -2147483648~2147483647 10e10数量级
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807 10e19数量级
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615 //20位
读入一整行字符
在读入一整行之前,应该先用getchar()捕获上一行输入的回车
int n;
cin>>n;
getchar(); //捕获缓冲区的回车
string s;
getline(cin,s);
用sscanf()分离读入后的字符串
在输入比较复杂时,用sscanf分离变量
/* 输入样式
17:48:19 21:57:24
11:05:18 15:14:23
17:21:07 00:31:46 (+1)
23:02:41 16:13:20 (+1)
10:19:19 20:41:24
22:19:04 16:41:09 (+1)
*/
//读入方式
string s;
int h1,m1,s1,h2,m2,s2,sec,d;
getline(cin,s);
if(s.back()!=')') s=s+" (+0)"; //string.back()表示最后一位字符
sscanf(s.c_str(),"%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d); //string.c_str()表示字符串string的字符串引用
树状数组函数模板
int lowbit(int x) //返回二进制下最末位的1及后面的0组成的数值
{
return x & -x;
}
void add(int x, int v) //在原数组下标为x的位置加上数值v,维护tr[](树状数组)
{
for(int i = x ; i < = N ; i += lowbit(i) ) tr[i] += v;
}
int query(int x) //求原数组下标为x的位置的前缀和,[x,y]连续区间的和 = query[y] - query[x-1];
{
int ans = 0;
for(int i = x; i > 0;i -= lowbit(i) ) ans += tr[i];
return ans;
}
用memset()函数给数组赋值
在初始化除char以外的数组时,只能初始化为0或-1。
const int N=1e6+5;
int f[N];
char a[N];
memset(f,0,sizeof(f)); //将int数组全部赋值为0
memset(a,'s',sizeof(a)); //将char数组全部赋值为字符s
错误用法
memset(f,1,sizeof(f));
因为memset是 逐字节 拷贝,以num为首地址的8字节空间都被赋值为1,即一个int变为 0X00000001 00000001 00000001 00000001,显然,把这个数化为十进制不会等于1的。