循环结构
数组(应需要产生)
循环+数组-->数据结构初步
例. 数4987.输出个位.十位.百位.千位
数组+循环
一维 二维 三维
离散-->线性(一对一){链表 栈 队列}-->树形(一对多)-->图(多对多)
链表(线性最基础):创建 追加 插入 删除 查找 累加 求和 升序 降序
New:删除 查找 累加求和 升序 降序
查找:查找x表示在链表中查找x第一次出现的位置
线性查找(O(n))最少查找次数为1
如果N很大 (1+n)/2=N
二分查找:二分法 树状数组
链表两个元素 a和len
数组a[101]
len变量
1 #include<iostream>
2 using namespace std;
3 int main(){
4 for(int i=起始值;i<=终了值; i++){
5 循环内容
6 }
7 return 0;
8 }
次数=终了值-起始值+1
找七练习(循环+分支)
从1到100之间 输出7的倍数或者个位是7 十位是7的数
1 for(范围内){ 2 if(按条件挑出){ 3 4 } 5 } //过筛子结构 范围内 按条件挑出 发起
用for循环结构从1-->100循环,条件为 i/10==7 || i%10==7 || i%7==0
1 #include<iostream>
2 using namespace std;
3 int main(){
4
5 for(int i=0;i<=100;i++){
6 if( i/10==7 || i%10==7 || i%7==0){
7 cout<<i<<" ";//空格
8 }
9 }
10 return 0;
11 }
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int x,f=1;
5 cin>>x;
6 if(x==2){cout<<"yes
";return 0;}
7 for(int i=2;i<=x-1;i++){
8 if(x%i==0){
9 f=0;
10 break;//强制退出循环
11 }
12 }
13 if(f==1){cout<<"yes
";}else{cout<<"no
";}
14 return 0;
15 }
优化:n-1 sqrt(n) 开平方
1 #include<iostream>
2 #include<cmath>
3 using namespace std;
4 int main(){
5 int x,f=1;//入口
6 cin>>x;
7 if(x==2){cout<<"yes
"; return 0;} //越特殊的越往上写
8 if(x%2==0){cout<<"no
"; return 0;}
9 for(int i=2;i<=sqrt(x);i++){
10 if(x%1==0){
11 f=0;
12 break;
13 }
14 }
15 if(f==1){cout<<"yes
";}else{cout<<"no
";}
16 return 0;//出口 可以有多个
17 }
break:强制结束循环
continue:结束本次 继续下一次循环
输入100以内既是3的倍数 又是5的倍数
1 #include<iostream>
2 using namespace std;
3 int main(){
4 for(int i=1;i<=6;i++){
5 cout<<i*15<<" ";
6 }
7
8 return 0;
9 }
二重循环
1 #include<iostream>
2 using namespace std;
3 int main(){
4 for(int i=1;i<=10;i++){
5 for(int j=1;j<=12;i++){
6 cout<<"0";
7 }
8 cout<<"
";
9 }
10 return 0;
11 }
1 for(){ 2 for(){ 3 4 } 5 }//多重循环 穷举
九九乘法表
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int n;
5 cin>>n;
6 for(int i=1;i<=n;i++){
7 for(int j=1;j<=n;j++){
8 cout<<j<<"X"<<i<<"="<<i*j<<" ";
9 }
10 cout<<"
";
11 }
12 return 0;
13 }
输出三角形
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int n;
5 cin>>n;
6 for(int i=1;i<=n;i++){
7 for(int j=1;j<=n-i;j++){
8 cout<<" ";
9 }
10 for(int j=1;j<=2*i-1;j++){
11 cout<<"*";
12 }
13 cout<<"
";
14 }
15 return 0;
16 }
*
**
***
****
*****
******
i " " "*"
————
1 0 1
2 1 2
3 2 3
i i-1 i
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int n;
5 cin>>n;
6 for(int i=1;i<=n;i++){
7 for(int j=1;j<=i-1;j++){cout<<" ";}
8 for(int j=1;j<=i;j++){cout<<"*";}
9 cout<<"
";
10 }
11 return 0;
12 }
***********
*********
*******
*****
***
*
i " " "*"
-------------------------------
1 0 11
2 1 9
3 2 7
4 3 5
i i-1 (2*n)-(2*i-1)
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int n;
5 cin>>n;
6 for(int i=1;i<=n;i++){
7 for(int j=1;j<=i-1;j++){
8 cout<<" ";
9 }
10 for(int j=1;j<=(2*n)-(2*i-1);j++){
11 cout<<"*";
12 }
13 cout<<"
";
14 }
15 return 0;
16 }
输出菱形
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int n; 5 cin>>n; 6 for(int i=1;i<=n;i++){ 7 for(int j=1;j<=n-i;j++){cout<<" ";} 8 for(int j=1;j<=2*i-1;j++){ 9 if(j==1 || j==2*i-1){ 10 cout<<"*"; 11 }else{ 12 cout<<" "; 13 } 14 } 15 cout<<" "; 16 } 17 for(int i=1;i<=n;i++){ 18 for(int j=1;j<=i;j++){cout<<" ";} 19 for(int j=1;j<=(2*n)-(2*i+1);j++){ 20 if(j==1 || j==(2*n)-(2*i+1)){ 21 cout<<"*"; 22 }else{ 23 cout<<" "; 24 } 25 } 26 cout<<" "; 27 } 28 return 0; 29 }
*
***
*****
*******
*********
*******
*****
***
*
i " " "*"
—————
1 4 1
2 3 3
3 2 5
i n-i 2*i-1
1 1 7
2 2 5
3 3 3
i i (2*n)-(2*i-1)
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int n;
5 cin>>n;
6 for(int i=1;i<=n;i++){
7 for(int j=1;j<=n-i;j++){cout<<" ";}
8 for(int j=1;j<=2*i-1;j++){cout<<"*";}
9 cout<<"
";
10 }
11 for(int i=1;i<=n;i++){
12 for(int j=1;j<=i;j++){cout<<" ";}
13 for(int j=1;j<=(2*n)-(2*i+1);j++){cout<<"*";}
14 cout<<"
";
15 }
16 return 0;
17 }
多重循环
对于多重循环而言,外层循环执行一次,内层循环将执行若干次,知道内层循环的条件不成立,外层循环才去执行下一次操作。
在多重循环中,内层循环必须在内层结束,不能出现内外循环交叉的情况 (来源:CCF程序设计P146)
1 #include<iostream>
2 using namespace std;
3 int main(){
4 for(int i=1;i<=7;i++){
5 for(int j=1;j<=7;j++){
6 for(int k=1;k<=7;k++){
7 cout<<i<<j<<k<<"
";
8 }
9 }
10 }
11 return 0;
12 }
输出所有1~7组合三位数的所有不重复的结果及总个数
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int s=0;
5 for(int i=1;i<=7;i++){
6 for(int j=1;j<=7;j++){
7 if(j!=1){
8 for(int k=1;k<=7;k++){
9 if(k!=i&&k!=j){
10 cout<<i<<j<<k<<"
";
11 s++;
12 }
13 }
14 }
15 }
16 }
17 cout<<s;
18 }
输出100以内的所有质数
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int f;
5 for(int i=2;i<=100;i++){
6 f=1;
7 if(i==2){cout<<i<<" ";continue;}
8 for(int j=2;j<=i-1;j++){
9 if(i%j==0){
10 f=0;
11 break;
12 }
13 }
14 if(f==1){cout<<i<<" ";}
15 }
16 return 0;
17 }
1 #include<iostream>
2 #include<cmath>
3 using namespace std;
4 int main(){
5 int x,f;
6 for(int i=2;i<=100;i++){ //冲突
7 f=1;
8 x=i;
9 if(x==2){cout<<x<<" ";continue;}
10 if(x%2==0){continue;}
11 for(int j=2;j<=sqrt(x);j++){
12 if(x%j==0){
13 f=0;
14 break;
15 }
16 }
17 if(f==1){cout<<x<<" ";}
18 }
19
20 return 0;
21 }
穷举 枚举 列举
分书方案(现在):五个人选五本书 不是随机 每本书只有一本
分书方案(复杂):n个人选n本书
1 1 1 0 1 //范围 选择全部 但 排除三
1 1 0 1 1
0 1 1 0 1
1 1 0 1 0
0 0 1 1 1
行表示人
列表示书
1 表示喜欢
0 表示不喜欢
12345
21345
24513
31245
35241
15324
14325
维度:描述对象样本特征的个数
为每一个人描述他能选择的书
1 1 1 0 1
1 1 0 1 1
0 1 1 0 1
1 1 0 1 0
0 0 1 1 1
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int ans=0;
5 for(int i=1;i<=5;i++){
6 if(i!=4){
7 for(int j=1;j<=5;j++){
8 if(j!=3 && j!=i){
9 for(int k=1;k<=5;k++){
10 if(k!=1 && k!=4 && k!=i && k!=j){
11 for(int m=1;m<=5;m++){
12 if(m!=3 && m!=5 && m!=i && m!=j && m!=k){
13 for(int w=1;w<=5;w++){
14 if(w!=1 && w!=2 && w!=i && w!=j && w!=k && w!=m){
15 cout<<i<<j<<k<<m<<w<<"
";
16 ans++;
17 }
18 }
19 }
20 }
21 }
22 }
23 }
24 }
25 }
26 }
27 cout<<ans<<"
";
28 return 0;
29 }
谁是小偷
有ABCD四个嫌疑人 只有一个小偷
A:"我不是小偷" i
B:"C是小偷 j
C;"小偷肯定是D" k
D;"C在冤枉好人" w
有一人在说谎 三人说的是实话 问谁是小偷
维度还是人
1 #include<iostream>
2 using namespace std;
3 int main(){
4 for(int i=0;i<=1;i++){
5 for(int j=0;j<=1;j++){
6 for(int k=0;k<=1;k++){
7 for(int w=0;w<=1;w++){
8 if(i+j+k+w==1 && (i!=1)+(k==1)+(w==1)+(w!=1)==3){
9 cout<<i<<j<<k<<w<<"
";
10 }
11 }
12 }
13 }
14 }
15
16 return 0;
17 }
在循环结构中的位运算
数据在计算机中采用二进制形式存储,一个0或者一个1称为一个二进制位,简称位。
& 按位与 对应二进制位均为为1时 结果为1 否则为0
| 按位或 对应的二进制有一个为1则为1
^ 按位异或 对应的二进制位数字不同时为1 否则为0
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int x=3,y=5;
//给定x y的值 经过下面三步之后可以将x y的值发生交换
5 x^=y;
6 y^=x;
7 x^=y;
8 cout<<x<<y;
9 return 0;
10 }
运行结果为 5,3
~取反 把运算数的各个二进制位按位求反
<<左移 m<<n 把m对应的二进制数的各个二进制位向左移n位 高位丢弃 低位0补齐
>>右移 m>>n 把m对应的二进制数的各个二进制位向右移n位 低位丢弃 高位0补齐
1 #include<iostream>
2 using namespace std;
3 int main(){
4 int x,y;
5 cin>>x>>y;
6 cout<<(x&y)+( (x^y)>>1 );
7 return 0;
8 }
模拟步骤//以3 5为例
①将x y转化成二进制数 即 011 101
②x&y=011&101=001
③x^y=011^101=110
④(x^y)>>1=(110)>>1=11
⑤(x&y)+( (x^y)>>1 )=001+11=001+011=100
⑥输出二进制数100对应的十进制数4