- 将整形数组a的前k个拷贝到b:memcpy(b,a,k*sizeof(int))。如果只想拷贝全部元素,可以这样做:memcpy(b,a,sizeof(a))
- &&是短路运算符,如果前面的表达式值为假,后面则不会计算。注意条件排列顺序可以优化速度以及防止越界等。
- strchr函数类似于string类的find,可以在字符串中查找字符
- 数字转字符串的方法
1.用sprintf函数可以将数字存储到字符数组中。如:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s [100];
int a=100,b=56,c=4;
float d=34.5678;
sprintf(s,"%d%x%d",a,b,c);
cout<<s<<endl;
sprintf(s,"%.3f",d);
cout<<s<<endl;
}
输出
100384,其中56转换成了16进制
34.568,其中四舍五入保留了3位小数
2.用c++的流,相当于重新读入,实现数字转string类。流不会读入空格。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
stringstream ss;
int a=100,b=56,c=4;
float d=34.567;
ss<<a<<b<<c<<d;
ss>>s;
cout<<s;
}
输出10056434.567。流读入的速度非常慢。
- 字符串转数字
1.用sscanf函数,注意要像scanf一样,加个&
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s1[]="123",s2[]="123.456";
int a;
float b;
sscanf(s1,"%d",&a);
sscanf(s2,"%f",&b);
cout<<a<<" "<<b;
}
输出123 123.456
2.用流
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1="123",s2="123.456";
stringstream ss1(s1),ss2(s2);
int a;
float b;
ss1>>a;
ss2>>b;
cout<<a<<" "<<b<<endl;
}
输出 123 123.456
-
用字符串常量简化程序
可以设置字符串常量s="1234567890-=…"每次输出后面的字符即可 -
回文词
#include<bits/stdc++.h>
using namespace std;
string r="AEHIJLMOSTUVWXYZ12358",r0="A3HILJMO2TUVWXY51SEZ8";//镜像字符串常量
//对应输出,由于下标分别是0,1,2,3则检测回文和镜像,回文串得1分,镜像串得2分,然后把得分当下标
string p[4]={"is not a palindrome.","is a regluar palindrome.","is a mirrored string.","is a mirrored palindrome."};
string s;
bool huiwen(string s)//回文
{
string s0=s;
reverse(s.begin(),s.end());
return s==s0?1:0;
}
bool rever(string s)//镜像
{
int i,l=s.length();
string s0;
for(i=0;i<l;i++)
{
if(r.find(s[i])==-1)return 0;
s0+=r0[r.find(s[i])];
}
reverse(s.begin(),s.end());
return s==s0?1:0;
}
int main()
{
while(cin>>s)
{
int sum=0;
if(huiwen(s))sum+=1;
if(rever(s))sum+=2;
cout<<s<<" -- "<<p[sum]<<endl;
}
}
- 环状序列
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
int n;
cin>>n;
while(n--)
{
string s0,min1;
int i,l;
cin>>s;
min1=s;//
l=s.length();
s+=s;//复制
for(i=0;i<l;i++)//起点0~l-1,长度为l
{
s0.assign(s,i,l);
min1=min(min1,s0);
}
cout<<min1<<endl;
}
}
- 得分
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
int n;
cin>>n;
while(n--)
{
int score=0,i,j,l;
cin>>s;
l=s.length();
for(i=0,j=0;i<l;i++)
{
if(s[i]=='O')score+=++j;
else j=0;
}
cout<<score<<endl;
}
}
- 分子量
#include<bits/stdc++.h>
using namespace std;
float c[50];
string s;
int main()
{
int n;
cin>>n;
c['C']=12.01;//简洁记录原子质量
c['H']=1.008;
c['O']=16.00;
c['N']=14.01;
while(n--)
{
int i,beg=0,l,num;
float sum=0;
cin>>s;
l=s.length();
for(i=0;i<l;i++)
{
if(s[i]>='C'&&s[i]<='O')//当前是字母
{
num=1;//num代表原子的个数
if(i==l-1)num=1;//当前是最后一个字符,num自然为1
else
{
beg=i+1;//从下一个字符开始
while(s[beg]>='0'&&s[beg]<='9'&&beg<=l-1)//s是数字且不要出界
beg++;
//上面语句执行完后,beg-1就是数字的最后一位,i+1是数字的第一位,数字长度为beg-1-i-1+1
string snum;//字符和数字转换
if(beg-i-1>0)snum.assign(s,i+1,beg-i-1);
stringstream ss(snum);
ss>>num;
}
sum+=num*c[s[i]];
}
}
printf("%.3f\n",sum);
}
}