洛谷题单
https://www.luogu.com.cn/training/9349
字符串读入
getline(cin,a);
//读入一行包括空格
for(int i=0;i<a.size();i++)
{
if(a[i]!=' '&&a[i]!='\n')
ans++;
}
打表和ascl运用
点击查看代码
#include <stdio.h>
int main(void){
char a[14], mod[12] = "0123456789X"; //先将mod11后的十一个字符存入数组
gets(a); //输入字符串
int i, j = 1, t = 0;
for(i = 0; i < 12; i++) {
if(a[i] == '-') continue; //字符串为分隔符‘-’时跳过此次循环进入下一次循环
t += (a[i]-'0')*j++; //t储存 第j个 数字 * j 的和
}
if(mod[t%11] == a[12]) printf("Right");
else {
a[12] = mod[t%11]; //若识别码错误,则赋正确的识别码,然后输出
puts(a);
}
return 0;
}
统计单词个数
重点
1.getline(cin,a)
2.tolower(a[i]);
3. a=' '+a+' ';(只统计独立单词的思维转化)
4.b.find(a)!=string::npos(find的运用)
点击查看代码
#include <iostream>
#include <string>
//命名空间
using namespace std;
int main(){
//定义两个字符串
string a;
string b;
//用string库,调用getline, 直接读入一整行
getline(cin,a);
getline(cin,b);
//转换大小写,可以都转换为大写,或者小写
for (int i=0;i<a.length();++i){
a[i]=tolower(a[i]);
}
for (int i=0;i<b.length();++i){
b[i]=tolower(b[i]);
}
//因为连起来的不算,所以要在前后加几个空格,一定要是同样多的,同量减同量,等于同量
a=' '+a+' ';
b=' '+b+' ';
//先看看会不会找不到,用a.find()和string::npos
if (b.find(a)==string::npos){
cout<<-1<<endl;
}
//如果找得到
else {
int alpha=b.find(a);
int beta=b.find(a),s=0;//计数器初始化为0
while (beta!=string::npos){
++s;//计数器
beta=b.find(a,beta+1);
}
cout<<s<<" "<<alpha<<endl;//输出第一个和总共有几个
}
//函数返回值为0,结束整个程序
return 0;
}
判断两个日期间回文串的个数
重点
1.月份打表
2.思维转化,枚举月日。再看是否合理
3.朴素算法: 依次枚举,日满月满归一
技巧
#inlcude<bits/stdc++.h>
using namespace std;
int i,j,n,m,a,b,c,sum,ans;
int s[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=12;i++)//枚举月和日
for (j=1;j<=s[i];j++)
{
c=(j%10)*1000+
(j/10)*100+
(i%10)*10+
(i/10);//算出前四位。
sum=c*10000+i*100+j;//算出整个日期
if (sum<n||sum>m) continue;
ans++;//统计
}
printf("%d",ans);
return 0;
}
朴素算法
#include <bits/stdc++.h>
using namespace std;
int y1,m1,d1,y2,m2,d2,sum;
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//存每个月的天数(2月是没用的)
bool check()
{
return (y1<y2)||((y1==y2&&m1<m2)||(y1==y2&&m1==m2&&d1<=d2));
//首先,只要现在的年份小于结束年份就一定可以继续循环;然后,如果现在的年份和结束年份相等,且月份小于结束年份也可以循环;最后,只有天数不同,就必须现在的天数小于结束天数。
}
int r(int x)
{
return ((x%4==0&&x%100!=0)||(x%400==0))?29:28;//判断2月的天数
}
bool palindrome(int y,int m,int d)
{
char s[8];
int t=y*10000+m*100+d;//将它重新组成日期
sprintf(s,"%d",t);//转换为字符
//可以替换为string s=to_string(t);
for(int i=0;i<4;i++)
if(s[i]!=s[8-i-1])
return false;
return true;//判断回文
}
int main()
{
int t1,t2;
cin>>t1>>t2;
y1=t1/10000; m1=t1/100%100; d1=t1%100;//分离出年份月份和日数
y2=t2/10000; m2=t2/100%100; d2=t2%100;
while(check())//判断是否枚举完
{
bool f=1;//f用于看是否一已经进行过日期更新
if(palindrome(y1,m1,d1))//原谅我用这么长的单词装逼
sum++;
if((m1==2&&d1==r(y1))||(m1!=2&&d1==day[m1]))//一个月完了
{
m1++;
d1=1;
f=0;
}
if(m1==13)//一年完了
{
y1++;
m1=1;
d1=1;
f=0;
}
if(f)//如果月没有结束,就直接加天数即可
d1++;
}
cout<<sum<<endl;
return 0;
}