算法竞赛入门经典三——数组和字符串

本文详细介绍了C++中字符串与整数、浮点数之间的相互转换方法,包括使用sprintf、sscanf、stringstream等函数,并展示了如何通过这些函数进行数字格式化。此外,文章还提供了如何判断字符串是否为回文串和镜像字符串的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 将整形数组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);
	}
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值