字符串 :
- 定义一个长度为 10的字符串,并且输出;
#include <stdio.h>
#include<iostream>
#include<algorithm>
char s[10];
int main(){
scanf("%s",s + 1); // 字符串 从 1 开始 ,不用 & 取地址,s 本身代表的就是字符串的首地址
int pos = 1;
while(s[pos]){
// 字符串的最后一位 是 '\0' , 也就是 0;
printf ("%c",s[pos++]);
}
printf ("\n");
}
//如果不想用 while 循环呢 ?
2 .字符串的一些函数
//1 . strlen 计算字符串的长度
#include <stdio.h>
#include<iostream>
#include<algorithm>
char s[10];
int main(){
scanf("%s",s + 1);
int len = strlen(s + 1);
for(int i = 1; i <= len ; i ++){
printf ("%c",s[i]);
}
for(int i = 1; i <= strlen(s + 1) ; i ++){
printf ("%c",s[i]);
}
//哪种方法更好呢?
printf ("\n");
}
// 2 .strch //寻找一个字符
scanf("%s",s + 1);
int len = strlen(s + 1);
printf ("%d\n",strchr(s + 1 , 'a') - s);
//3.strstr // 寻找一个字串
char s1[100],s2[10];
int main(){
scanf("%s%s",s1,s2);
printf ("%d\n",strstr(s1, s2) - s1);
}
//4.strcmp //比较两个字符串的大小
char s1[100],s2[100];
int main(){
scanf("%s%s",s1,s2);
printf ("%d\n",strcmp(s1,s2)); //前面大返回 1 ,后面大返回 0; 比较是字典序
}
字典序的定义 : 从左到右逐个比较对应的字符的大小,遇到中止符或者第个不同的截至(若中止是还没有找到不同,则短的那个字典序较小)。
指针
如果说变量储存在一个个房间里,那么指针相当于房间的编号。
int *a,x;
a = &x;
scanf("%d",a);
scanf("%d",&x); // 两种读入方法是一样的
int x[100];
scanf("%d",&x[0]);
scanf("%d",x); // 两种读入方法等价,x 代表数组的首地址
for(int i = 0; i <= 2; i ++){
scanf("%d",x + i);
}
for(int i = 0; i <= 2; i ++){
printf ("%d ",x[i]);
}
int s[100], *a;
a = s;
for(int i = 0; i < 10; i++) {
*a = i; a++;
}
for(int i = 0; i < 10; i++) {
printf("%d\n", s[i]);
}
// 数组中内存是连续的
int x[100] = {
87,99,877,65,5,6};
int main(){
int *a;a = x;
for(int i = 1; i <= 3; i ++){
printf ("%d",*a);
a++;
}
}
//这段代码会输出什么呢?
这里的 a 是一个指针 ,*a表示指向的变量 printf 会输出 a 指向的变量, a++ 是指针右移动一位
函数
求 1- 100 以内的素数
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
bool is_prime(int x){
if(x < 2) return 0;
for(int i = 2; i * i <= x; i ++){
if(x % i == 0) return 0;
}
return 1;
}
int main(){
for(int i = 1; i <= 100; i ++){
if(is_prime(i)) printf ("%d ",i);
}
}
交换函数
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
void swap1(int a,int b){
int t = a;
a = b;
b = t;
}
void swap2(int *a,int *b){
// 参数为两个指针变量
int x = *a ,y = *b ; // x 表示 a这个地址指向的变量
printf ("%d %d\n",x,y);
*a = y;
*b = x;
}
void swap3(int s[]) {
int t = s[0];
s[0] = s[1]; s[1] = t;
}
int main(){
int a = 3,b = 4;
swap2(&a,&b);
sawp1(3,4) == swap1(a,b); // 完全不会影响到 a , b 的值
printf ("%d %d\n",a,b);
int s[5];
s[0] = 3,s[1] = 4;
swap3(s);
printf ("%d %d\n",s[0],s[1]);
}
strstr //寻找子串 还有 kmp算法(复杂度更低) 后面会讲
int Strstr(char *s1,char *s2){
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i + len1 - 1 < len2; i ++){
int flag = 1;
for(int j = i; j <= i + len1 - 1; j ++){
if(s1[j - i] != s2[j]) flag = 0;
}
if(flag) return 1;
}
return 0;
}
递归函数
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
如果现在要你写一个函数 从 1 加到 n,并返回答案 , 是不是觉得很简单,但如果要求不使用循环该怎么写呢?
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int sum(int n){
if(n == 1) return 1; //到达递归终点 返回
return n + sum(n - 1); //再次调用 求和函数
}
int main(){
int n;
scanf("%d",&n);
printf ("%d\n",sum(n));
}
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”
0、1、1、2、3、5、8、13、21、34
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int fib(int n){
if(n == 1 || n == 2) return 1;
return fib(n - 1) + fib(n - 2);
}
int main(){
int n;
scanf("%d",&n);
printf ("%d\n",fib(n));
}
结构体 , pair<int ,int >;
位运算
x&y 如果 x 和 y 都为 1,则得到 1;如果 x 或 y 任何一个为 0,或都为0,则得到 0
x|y 如果 x 或 y 为 1,或都为 1,则得到 1;如果 x 和 y 都为 0,则得到 0 // 按位或
x^y 如果 x 或 y 的值不同,则得到 1;如果两个值相同,则得到 0
~x 如果 x 为 0,则得到 1,如果 x 是 1,则得到 0
n>>k n的二进制数 右移k位 5 (00101) 5>>1 (00010) 5>>2 (00001)
n<<k n的二进制数 左移k位 5 (00101) 5<<1 (01010) 5>>2 (10100)
x & 1 //判断奇偶性
1 << x 求 2 的 x 次方
堆栈和队列
堆栈(先进后出)
#include <stdio.h>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
stack< int >st;
int main(){
for(int i = 1; i <= 10; i ++){
st.push(i);
}
printf ("%d\n",st.top());
st.pop();
printf ("%d\n",st.top());
}
队列(先进后出)
queue< int >que;
int main(){
for(int i = 1; i <= 10; i ++){
que.push(i);
}
printf ("%d\n",que.front());
que.pop();
printf ("%d\n",que.front());
}
//栈
//s.empty(); //如果栈为空则返回true, 否则返回false;
//s.size(); //返回栈中元素的个数
//s.top(); //返回栈顶元素, 但不删除该元素
//s.pop(); //弹出栈顶元素, 但不返回其值
//s.push(); //将元素压入栈顶
//队列
//q.empty(); //如果队列为空返回true, 否则返回false
//q.size(); //返回队列中元素的个数
//q.front(); //返回队首元素但不删除该元素
//q.pop(); //弹出队首元素但不返回其值
//q.push(); //将元素压入队列
//q.back(); //返回队尾元素的值但不删除该元素
sort
sort (x , x + n); //默认从小到大排序
数组名 , 数组名 + 长度
bool cmp(int a,int b){
// 重新定义,从大到小排序
return a > b;
}
bool cmp(node a,node b){
//结构体,按 x 从小到大排序
return a.x < b.x;
}
冒泡排序 :
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 1e2 + 7;
const int mod = 1e9 + 7;
msort(int a[] , int n){
for(int i = 1; i <= n; i ++){
//每次循环把最大的数放到最右边
for(int j = 1; j < n; j ++){
if(a[j] > a[j + 1]){
swap(a[j] , a[j + 1]);
}
}
}
}
int n , a[100];
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i ++){
scanf("%d",&a[i]);
}
msort(a,n);
for(int i = 1; i <= n; i ++){
printf ("%d ",a[i]);
}
printf ("\n");
return 0;
}