华师一附中OI组
标题:
D 1
[打印本页]
作者:
admin
时间:
2023-7-1 11:38
标题:
D 1
1. 深度分析数据的类型
数的表示 二进制 原码反码补码 所占空间和范围
char, short int, int ,long long
unsinged
位操作 cout<<(3^2); (以后专门讲)
bitset
结构体
指针 p=* int
字符串与字符数组
Play safety
int l;
string s="SJF NIU";
l=s.size();
cout<<(l>-3)<<endl;
cout<<(s.size()>-3)<<endl;
2. 输入输出的技术
初学c++一般建议用cin和cout进行输入输出,不用考虑太多的格式,基本够用,比如输入一个整数 int x;cin>>x;
输出一个字符串 cout<<s;
输出实数保留两位小数 cout<<fixed<<setpricision(2)<<x;(注意iomanip库)
输出一个整数占4个格子 cout<<setw(4)<<x; (注意iomanip库)
输出一个整数占4个格子,不足4位前面补0 cout<<setw(4)<<setfill(“0’)<<x;
输出数字对应的字符 cout<<char(x)
输出一个整数的16进制(8进制)cout<<hex<<uppercase<<x; (uppercase表示大写)
输出特殊字符 \ “ 等 \\ \t
关掉同步,读写缓冲 ios::sync_with_stdio(false);
改变键盘屏幕读写到文件读写 freopen(“1.in”,”r”,stdin); freopen(“1.out”,”w”,stdout);这样后面的都写全部换向到文件,信息学奥赛有人这样写:
#define file(z) freopen(z".in","r",stdin),freopen(z".out","w",stdout) 也很有意思的。
经过了一段时间的学习,可以考虑使用scanf和printf进行输入输出,他们是为了兼容早期的C语言 而留下来的,最主要的特点是速度快。
考试的时候用文件进行输入输出,这就要在main函数里,cincout前加上文件关联语句,写成如下,还得在头文件里面包含cstdio
读到文件尾会产生一个错误码,
cin不能读入带空格的字符串,要换用 geiline(cin,s)
格式化输入语句scanf和格式化输出语句scanf在考试里面常常被用到,实验表明,在大量数据的读入时scanf耗时远小于cin,所以一般情况下高手都用scanf,更有高高手使用快读技术,核心是getchar和putchar,据说更快。
printf可以按照所需的格式输出数据,比如保留两位小数,输出16进制数等。
例子:x=1.0/6;printf(%.2f,x); 输出x保留两位小数。
printf(“%X”,x) 按十六进制输出一个数。
printf(“%O”,x) 按八进制输出一个数。
while(scanf(“%d”,&a)!=-1) {} 连续不断的读到文件尾
手动测试时ctrl+z或者F6表示输入结束
看看如下几个题目对应的读法
输入N和N个正整数,求他们的和 cin>>n;while (n--) {cin>>x;s+=x;}
输入若干正整数,以-1结尾,求他们的和,-1不包含在内cin>>x;while (x!=-1) {s+=x;cin>>x;}
in文件里面有若干正整数,求他们的和 while(cin>>x) s+=x;cout<<s; 注意中断这个要用F5或者ctrl_z
快读快写技术()
快读即快速读入,因为getchar比scanf要快,所以可以用getchar()代替scanf。
利用getchar()将输入的数字挨个判断,第一个while判断符号正负;第二个while判断数字并进行该数字的运算,每读入一个数字就将之前的数乘以十加上这个新的数字;两个while都不符合就说明该数输入完毕,返回该数的总值即绝对值*符号位。
inline int read(){
register int x = 0, t = 1;
register char ch=getchar(); // 读入单个字符到寄存器
while(ch<'0'||ch>'9'){
if(ch=='-')
t=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48); // 移位与异或
// 第十行可以换成 x = x * 10 + ch - '0'
ch=getchar();
}
return x*t;
}
快写
inline void write(int x)
{
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
格式化读入 13:23:54 cin>>ch;
混读很可怕! 123DEF linux 下的回车!
3. 几个常用的函数
floor(x) ceil(x) round
int(-2.3) floor(-2.3)
pow(x,y) x的y次方,返回是实数,可以用于大略估算,比如开方,三次根等。
log(x)= ln(x)
log10(x) log2(x)
swap(x,y)
min(x,y)
isalpha() / isdigit() / isalnum() / islower() / isupper()
tolower/toupper
memset和memcpy(注意结合)
4. 常用的字符串函数
geiline整行读入数据,一般的cin或者scanf的读入是以空格为分隔的,要是读入含有空格的数据,比如外国人的姓名,cin和scanf就很麻烦,可以考虑使用geiline或者gets,但要注意最好全程getline,用了getline再混用cin和sacnf不是件好事。
假设字符串为s,重载了 + < > 等
s.size()和s.length()都是表示它的长度,但是注意他们的类型。
s[i]和s.at(i)表示它的第i位,
s.substr(i,j) 是截取s串从第i位开始的连续j个,得到一个新的字符串;
s.erase(i,j) 是删除从s串从第i位开始的连续j个,注意不是第i到第j位;
s.find(t,i)是在s串第i位开始的地方开始查找t串,输出t串的起始位置,未找到就输出-1;
s.insert(t,i) 是把t串插到s串第i位开始的地方,后面的顺移;
5. 位操作
Xor的妙用
求不超过x的最大2的幂次方 100 输出64 200 输出128
6. 控制语句
;和,
a=b是有值的
i++与++i
if,for,while, do while,
break,continue,return
作者:
admin
时间:
2023-7-1 14:54
#include <bits/stdc++.h>
using namespace std;
int x,k,w;const int mx=110;
int a[mx];
int main()
{
cin>>x;
int i=0;
while (x>0)
{
k=x%2;
a[i]=k;
x=x/2;
i++;
}
for (i--;i>=0;i--) cout<<a[i];
return 0;
}
复制代码
作者:
admin
时间:
2023-7-1 14:58
#include <bits/stdc++.h>
using namespace std;
int x,k,w;
const int mx=110;
string s;
int main()
{
cin>>x;
while (x>0)
{
k=x%2;
x=x/2;
s=char ('0'+k)+s;
}
cout<<s;
return 0;
}
复制代码
作者:
admin
时间:
2023-7-1 15:07
#include <bits/stdc++.h>
using namespace std;
int x,k,w;
string s;
int main()
{
cin>>s;
int l=s.size();
x=0;
for (int i=0; i<=l-1; i++)
{
k=s[i]-'0';
x=2*x+k;
}
cout<<x;
return 0;
}
复制代码
作者:
admin
时间:
2023-7-1 15:13
#include <bits/stdc++.h>
using namespace std;
int x,k,w;
string s;
int main()
{
cin>>x;
cout<<oct<<x;
return 0;
}
复制代码
作者:
admin
时间:
2023-7-1 15:20
#include <bits/stdc++.h>
using namespace std;
int main()
{
char x;
cin>>x;
int y=0;
if (x>='a' && x<='z') y=1;
if (x>='A' && x<='Z') y=1;
cout<<"NY"[y];
return 0;
}
复制代码
作者:
admin
时间:
2023-7-1 15:31
#include <bits/stdc++.h>
using namespace std;
int x;
string s;
int main()
{
cin>>x;
s="";
do
{
int k=x%2;
x=x/2;
s=char('0'+k)+s;
}
while (x>0);
cout<<s;
return 0;
}
复制代码
作者:
admin
时间:
2023-7-1 17:11
#include <bits/stdc++.h>
using namespace std;
int sa,sb;
int main()
{
char ch;
string s;
cin>>ch;
while (ch!='E')
{
if (ch=='W' || ch=='L')s=s+ch;
cin>>ch;
}
cout<<s;
int l=s.size();
sa=sb=0;
for (int i=0; i<=l-1; i++)
{
if (s[i]=='W') sa++;
if (s[i]=='L') sb++;
bool b1=(sa>=11||sb>=11);
bool b2=abs(sa-sb)>=2;
if (b1&& b2)
{
cout<<sa<<':'<<sb<<endl;
sa=sb=0;
}
}
cout<<sa<<':'<<sb<<endl;
return 0;
}
/*
WWWWWWWWWWXWWYWWWWWWWWXX
WWLWE
*/
复制代码
作者:
admin
时间:
2023-7-1 17:27
#include <bits/stdc++.h>
using namespace std;
int sum,mx;
int main()
{
int N;cin>>N;
sum=0;
int mxmoney=-1;
string sname,mxname;
int pjf,bjf;
char gb,xb;
int lw;
while (N--)
{
int money=0;
cin>>sname>>pjf>>bjf>>gb>>xb>>lw;
if (pjf>80 && lw>=1) money+=8000;
if (pjf>85 && bjf>80) money+=4000;
if (pjf>90) money+=2000;
if (pjf>85 && xb=='Y') money+=1000;
if (bjf>80 && gb=='Y') money+=850;
sum+=money;
if (money>mxmoney)
{
mxname=sname;
mxmoney=money;
}
}
cout<<mxname<<endl;
cout<<mxmoney<<endl;
cout<<sum<<endl;
return 0;
}
/*
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1
*/
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2