写代码需考虑①变量的类型是string、int、long long、char、double这个very important!②输出的格式,通常和代码的整体架构有关,要求不要急于写,先构思,draw a picture in your brain, 整体结构想好了,再开始写。
1.string和char的转化
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s;
s="123456";
char c[s.length()];
strcpy(c,s.data());
cout<<c;
}
对于data(),很简单,他是string类的一个函数,作用是返回指向现有串的第一个字符的指针。
2.char转string(较简单)
#include<iostream>
using namespace std;
int main()
{
char a[]=" abc d\0efg ";
string s=a; //直接赋值
cout<<s;
return 0;
}
3.若需输入字符串的个数n,则在scanf(“%d”,&n);后千万千万记得加getchar();
4.需要输入多组数据时可以while(n–)
5.字符串的题通常需定义长度len
6.string不可用strcpy and strcmp,需要s.data();返回指针。
7.
第一:字符串中的数字转整型为-‘0’。
第二:小写转大写 减32,大写转小写 加32(小写的ascii码大于大写的ascii码)。
第三:字符串中大小写的转化通常需要定义两个大小一样的字符数组。或者string s ;char a[s.length]。而且还需要定义两个字符串的长度int len,n;
8.单个字符输入时需要&即
char c;
scanf("%c",&c);
but but but!!!
字符数组或者字符串输入时不!需!要!
举个栗子:
string s;
scanf(“%s”,s);
9.读入带有空格的字符串时可
getline(cin,s);
【attention】s只可为string,不可为char!!
or cin.getline(s);
10.cin和scanf的机理不同,ios见收藏,多看,理解。
11.map、set、vector
【字符串去重】
1.set给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序。
> for(int i=0;i<len;i++) st.insert(s[i]);//往set里面装东西用insert()
> for(auto i=st.begin();i!=st.end();i++) //auto自动判断i的类型(automatic)
> cout<< *i;//输出需加取值符号
12.find()。erase()函数用来去子串
while(s1.find(s2)!=-1){
pos = s1.find(s2);
s1.erase(pos,s2.length());
}
①s1.find(s2)返回子串s2第一个字母的在母串s1中的地址
不存在返回-1;
②erase(开始去除的下标,去除子串的长度s2,length())。
map:1.键值对:字符串string是键值是int型
2.直接实现对键的排序
话不多说,上代码!!
#include <iostream>
#include <string>
#include <map>
using namespace std;
string str;
map <string,int> mp;
int flag=0;
int main(){
//freopen("E:\\programme\\C++\\test.txt","r",stdin);
while(cin >> str){
mp[str]++;
}
for (auto it:mp){
if (it.second == 1){
if (flag) cout << it.first;
else {
cout << it.first << " ";
flag=1;
}
}
}
return 0;
}
/①/freopen(“E:\programme\C++\test.txt”,“r”,stdin);可用于打开文件,freopen、“r”、stdin;
②it.first 是键,it.second 是值。
③ for(auto it:mp)循环的缩写
13.上个题中的cin是如何分次读取含有空格的字符串滴腻?
cin将读入字符串读入流中
关于c++中的标准输入流对象的应用可以参考一下这篇博文:
http://blog.csdn.net/k346k346/article/details/48213811
看不懂?反正就是可以读含有空格的字符串
14.写在主函数前面的内容,抄的大佬的,那你会背了,可就NB 了!!!
https://editor.csdn.net/md/?articleId=104354196
15.关于C++中ios::sync_with_stdio(false);取消同步
cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几。
好处:iostream默认是与stdio关联在一起的,以使两者同步,因此消耗了iostream不少性能,设置为false后,不再同步了,iostream的性能提高了很多倍。
坏处:副作用:不能scanf cin之类的混用了。TLE?
搞不懂,慢慢来。
16.运行时间超时优化问题
来两个题:
例子1;
↑↑↑↑↑↑这是个很大的数了
斐波那契数列每60个循环一回!!不知道吧,赶快装脑子里啊!!
#include<stdio.h>
int fact(int n){
int r;
if(n==1||n==2) return 1;
else{
r=fact(n-1)+fact(n-2);
return r%10;
}
}
int main(){
int n,x;
scanf("%d",&n);
x=fact(n%60);
printf("%d",x);
}
例子2:
每70数中有16个符合题意,怎么知道的?
#include<iostream>
using namespace std;
int main()
{
int i,n;
int cnt=0;
cin>>n;
if(n>=70)
{
cnt=n/70*16;
}
int m = n%70;
for(i=7;i<=m;i++)
{
if(i%7==0||i%10==7)
{
cnt++;
}
}
cout<<cnt;
return 0;
}
3。数组求和加强版(所以,注意题中变量的取值范围很重要)
17.求素数,六七行代码就搞定
int main()
{
int n=9;
int i;
for(i=2;i<=sqrt(n);i++)//这种还不用考虑2,多爽!
{
if(n%i==0) return 0;
}
cout<<"yes";
return 0;
}
18.PI = 3.1415926535!!!还有535!!很重要!
emmmm。。。。暂时就这么多,命要紧……
19.进制转化
(1)十进制转n进制(取模,整除)
while(t!=0){
a[i]=t%n;//n一般为2,8,16
i++;
t=t/16;
}
for(int j=i-1;j>=0;j--)//注意数字从高位到低位打印,
//但0到n-1是从低位到高位存的
(2)n进制转10进制(次方)
for(i=len-1;i>=0;i--)//倒着来,从个位开始加
{
sum += num * pow(n,len-1-i);
}
- 辗转相除法求最大公约数
#include<iostream>
using namespace std;
int gcd(int m,int n){
int r;
while(n!=0){
r = m%n;
m = n;
n = r;
}
return m;
}