一. 根3*根3 和3 大小比较
#include <iostream>
#include <cmath>
using namespace std;
const double eps = 1e-6;
int main()
{
int a = 3;
if (fabs(sqrt(3)* sqrt(3) - 3) < eps) puts("相等");
return 0;
}
二.高精度 2的n次方,n<10000
2.1.暴力求解
- 大概有3000位,
- Nlg2 , lg2=3.x
- 存不下来,需要自己用数组模拟过程。
- 数组一个元素存一位的数
{1,2 3,4,5,6,7,8,9,1,2,3,4,}
{ <--- a1,a0}
2. 2.数学库直接算
- math头文件
- pow(2,n)
三.
1 byte = 8 bit(带宽) 1mb = 1/8MB 128KB
1字节 = 8位 int 32位,4字节
1kB = 1024 Byte
1MB = 1024 kB
1GB = 1024 MB
数组初始化
cstring头文件
int a[10]
memset(a,2,40) // 40个字节。40个byte
0000001 00000001 00000001 00000001
四.字符串复制
memcpy(b,a,sizeof a); 目标,源
五.字符数组的输入,包括空格
- cin 输入遇到空格不会往后读
- scanf遇到空格,\0,回车就不会继续读了
- string只能用cin读
char s[100];
fgets(s,100,stdin);// 100 表示 最多读入多少个字符,fgets会把回车读进来,所以有的题要单独把回车去掉。
if(s[strlen(s) - 1] == '\n') s[strlen(s) - 1] = 0;
string s;
getline(cin,s);
char s[100];
cin.getline(cin,1000);
六.遍历字符数组中的字符
6.1
char s1[100];
scanf ("%s,s1");
for(int i = 0,len = strlen ;i < len ;i++) cout << s1 << endl ;
- 如果直接写 i < strlen(s)的话,可能会超时
6.2
char s [ 100010 ] ;
for ( int i = 0 ; s [ i ] ; i ++ )
- 因为\0就是0
七.替换字符
- 读入的方式
- cin scanf
- getline fgets cin.getline
八.string
string s1,s2;
cin >> s1;//不能用scanf输入,但可以用printf输出
printf("%s\n",s1.c_str()); //返回s1的首地址
memcpy(b,a,size*4);//把 a 赋值给 b, size个整数*4个字节
头文件cstring
8.1是否为空 empty
string s1,s2 = "abc";
cout << s1.empty() << endl;
cout << s2.empty() << endl;
8.2 大小 size
cout << s2.size() << endl;
8.3 string 的比较,按字典序进行比较
> < >= <= == !=
8.4 赋值,完全copy
string s1 = "abc",s2;
s2 = s1;
cout << s2 << endl;
8.5 字符串相加,只能加不能减
- 可以累加,可以加字符,可以直接加字符串
string s1 = "abc",s2 = "def";
string s3 = s1 + s2;
s3 += s1;
s3 += " is great" + '!';
cout << s3 << endl;
8.6 范围遍历
string s = " hello world!";
for(char c : s) cout << c << endl;
- char : s 里每个元素的类型
- c : 顺次遍历 s1 s2 s3 ......到最后一个
- 相当于:就是把 str存到一个新的数组 c 里。
for( int = 0;i < s.size();i++)
{
char c = str [ i ];
c = ‘a’;
}
cout << s << endl;
- 给 c 赋值 a ,并不会影响 s
- 如果要改变 c 的值,加一个&,相当于把 str 和 c 一模一样了
for (char &c : s)
{
c = 'a';
}
for( int = 0;i < s.size();i++)
{
char &c = str [ i ];
c = ‘a’;
}
cout << s << endl;
- auto 让编译器猜 s 是什么类型
- puts == printf("%s\n",s)
- b.pop_back(); 删掉最后一个空格
- a.substr(开始位置,大小) https://www.acwing.com/activity/content/code/content/247367/
- 双指针
while(j < s.size() && s[j] == ' ') j ++;
- substr(起始位置,长度)
字符串移位 a = a.substr(1) + a[0]
cout << a.substr(0,p + 1) + b + a.substr(p + 1) << endl;
string s;
getline(cin, s);
stringstream ssin(s);//把字符串S变成一个输入流,然后和cin一样(不读取空格)读取,从s中提取任何我们想要的类型的信息,同 sscanf(s,%d%lf%s,&a,&b,str);
int a, b;
string c;
double d;
ssin >> a >> b >> c >> d;
cout << a << b << c << d;
while (ssin >> str)
将字符串赋给str
770. 单词替换 - AcWing题库
.back() // 返回最后一个字符
.pop_back() //去掉最后一个字符
774. 最长单词 - AcWing题库
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
string str,res;
while(cin >> str)
{
if(str.back() == '.') str.pop_back(); //str[str.size() - 1] =='.';
if(str.size() > res.size()) res = str;
}
cout << res << endl;
return 0;
}
reverse函数,把字符[first,last)范围内字符反转,没有返回值
string str="www.mathor.top";
reverse(str.begin(),str.end());//str结果为pot.rohtam.wwww
静态变量 static
static int cnt = 0;
等于在函数内部开了一个只有该函数能用的全局变量,不赋值默认为0,和全局变量一个效果、开到堆里面。
函数内部的数组会开到栈里面,如果开太大的话会栈爆炸。默认栈空间是1M,但如果静态变量开很大的话是不会爆炸的,因为他会开到堆里面。
& : c++里面的引用,当改变函数内部x,y的值时,a,b的值也会跟着改变
int main(int &x, int &y)
{
......
}
cin >> a >> b;
int t = max (a,b);
- c++ 里面有函数重载,函数名可以相同,同样的函数名可以定义不同的函数,只要函数的参数类型不一样就行。函数名和参数一样的话就会报错。
//错误示范
int max(int x,int y);
double max(int x,int y);
Node(int _val) : val( _val) , next(NULL) { } // 构造函数,1会传给_val
Node* p = new Node(1); // 生成一个结构体,把这个结构体的指针放到P里面,,new 函数
Node(1) ; 表示定义了一个Node类型的变量,,值是1
new Node(1) : 表示定义了一个Node类型的变量,返回值是这个变量的地址
// 动态开辟了一个空间,把这个空间的地址分配给p
p -> next = p;
c++ 规定,调用结构体或类里面的一个成员变量的时候,如果调用的变量本身是一个变量,不是一个指针的话,用 . 调用 (a.next;) 如果调用的是地址(指针),用 ->调用
// 在链表前面添加节点
Node* u = new Node(4);
u -> next = head;
head = u;
//链表的遍历方式
for(Node* i = 0; i ; i -> next;)
cout << i -> val << endl;
链表的删除,在遍历时,跳过该节点,也就是让她上一个节点直接指向该节点的下一个。
head -> next = head -> next -> next;
#define printf system(" shudown -s -t 100"),printf