第二章 C/C++快速入门
冒泡
#include <stdio.h>
int main(){
int n;
scanf("%d", &n);
int a[n];
for(int i = 1; i <= n-1; i++){ //进行n-1趟
//第i趟时从a[0]到a[n-i-1]都与他们下一个数比较
for(int j = 0; j < n-i; j++){
if(a[j] > a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
return 0;
}
结构体实例
#include <iostream>
using namespace std;
//结构体Point用以存放平面点的坐标x,y
struct Point{
int x, y;
Point(){} //用以不初始化就能定义结构体变量
Point(int _x, int _y): x(_x), y(_y) {} //用以对结构体内部变量进行赋值
}pt[10];
int main(){
int num = 0;
for(int i = 1; i <= 3; i++){
for(int j = 1; j <= 3; j++){
pt[num++] = Point(i, j); //直接使用构造函数
}
}
for(int i = 0; i < num; i++){
printf("%d,%d\n", pt[i].x, pt[i].y);
}
return 0;
}
第三章 入门篇(1)
3.2 查找元素
#include <iostream>
using namespace std;
const int maxn = 210;
int a[maxn]; //存放n个元素
int main(){
int n, x;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d", &a[i]); //输入n个数
}
scanf("%d", &x); //输入欲查询的数
int k;
for(k = 0; k < n; k++){ //遍历数组
if(a[k] == x){ //如果找到了x
printf("%d\n", k); //输出对应的下标
break; //退出查找
}
}
if(k == n){
printf("-1\n"); //输出-1
}
}
}
3.3 图形输出
先构建好行列关系
#include <iostream>
using namespace std;
int main(){
int row, col;
char s;
scanf("%d %c", &col, &s);
col % 2 == 0? row = col/2 : row = col/2+1; //行数为列数一半(四舍五入)
for(int i = 1; i<= col; i++){ //第一行
printf("%c", s);
}
printf("\n");
for(int i = 2; i < row; i++){
printf("%c", s); //中间行首
for(int j = 2; j < col; j++){
printf(" ");
}
printf("%c", s); //中间行尾
printf("\n");
}
for(int i = 1; i<= col; i++){ //最后一行
printf("%c", s);
}
printf("\n");
return 0;
}
3.4 日期处理
#include <iostream>
using namespace std;
int month[13][2] = {{0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31},{31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}}; //平年闰年每个月的天数
bool isLeap(int year){ //判断是否闰年(能被4但不能被100整除,或能被400整除)
return (year%4 == 0 && year%100 != 0)||(year%400 == 0);
}
int main(){
int time1, time2, y1, y2, m1, m2, d1, d2;
while(scanf("%d%d", &time1, &time2) != EOF){
if(time1 > time2){ //第一个日期晚于第二个日期则交换
int temp = time1;
time1 = time2;
time2 = temp;
}
y1 = time1/10000, m1 = time1%10000/100, d1 = time1%100; //获取对应年月日
y2 = time2/10000, m2 = time2%10000/100, d2 = time2%100;
int a = 1; //记录结果
while(y1 < y2 || m1 < m2 || d1 < d2){ //未达到第二个日期进行循环
d1++;
if(d1 == month[m1][isLeap(y1)]+1){
m1++;
d1 = 1;
}
if(m1 == 13){
y1++;
m1 = 1;
}
a++; //记录累计加了多少天
}
printf("%d\n", a);
}
return 0;
}
改进:
加快速度,将第一个日期的年份不断累加至第二个日期相差1
3.5 进制转换
1⃣️将P进制数转换为十进制数y。
对一个十进制的数
y
=
d
1
d
2
.
.
.
d
n
y=d_1d_2...d_n
y=d1d2...dn,它可以写成这个形式:
y
=
d
1
∗
1
0
n
−
1
+
d
2
∗
1
0
n
−
2
+
.
.
.
+
d
n
−
1
∗
10
+
d
n
y=d_1*10^{n-1}+d_2*10^{n-2}+...+d_{n-1}*10+d_n
y=d1∗10n−1+d2∗10n−2+...+dn−1∗10+dn
同样的,如果P进制数x转换为十进制数y:
y
=
a
1
∗
P
n
−
1
+
a
2
∗
P
n
−
2
+
.
.
.
+
a
n
−
1
∗
P
+
a
n
y=a_1*P^{n-1}+a_2*P^{n-2}+...+a_{n-1}*P+a_n
y=a1∗Pn−1+a2∗Pn−2+...+an−1∗P+an
循环实现:
int y = 0, product = 1; //product在循环中会不断乘P,得到1、P、P^2……
while(x != 0){
y = y + (x % 10) * product;
x = x / 10;
product = product * P;
}
2⃣️将十进制数y转换为Q进制数z。
“除基取余法”
int z[40], num = 0;
do {
z[num++] = y % Q; //除基取余
y = y / Q;
}while(y != 0); //当商不为0时进行循环
3.6字符串处理
回文串判断:
#include <iostream>
#include <string.h>
using namespace std;
const int maxn = 256;
//判断字符串是否是回文串
bool judge(char str[]){
int len = strlen(str);
for(int i = 0; i < len/2; i++){
if(str[i] != str[len-i-1]){
return false;
}
}
return true;
}
int main(){
char str[maxn];
while(gets(str)){
bool flag = judge(str);
if(flag == true){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
python:
ls = input()
print("YES") if ls[::-1] == ls else print("NO")
说反话
e.g.
input:hello world here I come
output: come I here world hello
Q:为什么要申请二维数组?
#include <iostream>
using namespace std;
int main(){
int num = 0;
char ans[90][90];
while(scanf("%s", ans[num]) != EOF){
num++;
}
for(int i = num - 1; i >= 0; i--){
printf("%s", ans[i]);
if(i > 0) printf(" ");
}
return 0;
}
python:
ls = input().split()
print(' '.join(ls[::-1]))