寒假的120道pta的总结

写代码需考虑①变量的类型是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);
	}
  1. 辗转相除法求最大公约数
#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;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值