數組 數組是啥? 數組是幹嘛的? 數組怎麼用? 不管咋樣,先看百科瞭解億下: C++ 數組 —— 菜鳥教程 C++ 支持數組數據結構,它可以存儲一個固定大小的相同類型元素的順序集合。數組是用來存儲一系列數據,但它往往被認為是一系列相同類型的變數。 數組的聲明並不是聲明一個個單獨的變數,比如 numb ...
數組
數組是啥?
數組是幹嘛的?
數組怎麼用?
不管咋樣,先看百科瞭解億下:
C++ 數組 —— 菜鳥教程
C++ 支持數組數據結構,它可以存儲一個固定大小的相同類型元素的順序集合。數組是用來存儲一系列數據,但它往往被認為是一系列相同類型的變數。
數組的聲明並不是聲明一個個單獨的變數,比如 number0、number1、...、number99,而是聲明一個數組變數,比如 numbers,然後使用 numbers[0]、numbers[1]、...、numbers[99] 來代表一個個單獨的變數。數組中的特定元素可以通過索引訪問。
所有的數組都是由連續的記憶體位置組成。最低的地址對應第一個元素,最高的地址對應最後一個元素。
這都是啥跟啥啊?!
數組 array是C++等編程語言里重要的數據結構,後期我們將學 棧stack、隊列queue等。
同時,C++裡面的vector
與Python裡面的list
差不多,array
、list
的下標都是從0開始的。為了方便我們後期可能會使用 \(STL\) 大法!
別的先別說了,開搞吧!
數組也有數據類型,比如有整數型的、長整數型的、浮點型的等等,其中的字元數組就是字元串的一種。
定義方法:
數據類型 數組名[數組長度]={數組內容};
我建議大家在定義數組時定義在main
函數外面,這樣一是方便其他函數使用,二是這樣寫可以給數組的每個元素賦值為0(變數的值也是0)。
在主函數內定義,這種數組就成為了局部變數,而且用不到的元素C++預設為隨機數,有可能你找半天bug也找不到……
要是給一個數組的每一個元素快速賦值,可以使用memset
函數,就像這樣:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int a[101];
// 初始化
memset(a,-1,sizeof(a));
// 等同於 int a[101]={};
// 輸出
for(int i=0;i<101;i++){
cout<<a[i]<<" ";
}
return 0;
}
那麼,給你出一道題:
請你輸出正整數 \(n\) 各個數位上的數。
輸入:1234
輸出:1 2 3 4
哈哈,可惜你沒學過字元串,不然輕輕鬆松就給秒了。
我們可以使用數組儲存每一位的數字,然後再輸出。
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
cin>>n;
while(n) a[k++]=n%10,n/=10;
// 倒著輸出
for(int i=k-1;i>=0;i--){
cout<<a[i]<<" ";
}
return 0;
}
你要是再厲害一點兒呢,可以這麼寫:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
cin>>n;
while(n) a[k++]=n%10,n/=10; // 獲取每一位上的數字
// 先把每一位的數字變成正確的順序
for(int i=0;i<k/2;i++){
// 交換兩個變數的值
// swap(a[i],a[k-i-1]);
// swap可以交換兩個變數的值
// 臨時變數法
m=a[i],a[i]=a[k-i-1],a[k-i-1]=m;
}
for(int i=0;i<k;i++){
cout<<a[i]<<" ";
}
return 0;
}
這是個數學原理。要獲取 \(a\) 每一位上的數字,可以這麼乾:
\[a\ mod\ 10( 獲取最後一位的數字)\Longrightarrow \left \lfloor a{\div} 10 \right \rfloor (a縮小到原來的\frac{1}{10}) \]總之,任何強大的成績,都建立在海量的刷題之上。
來做個倆題兒吧:
第一題不難,你應該已經有思路了吧?!
很簡單,用上剛剛的數組知識,解個這種題嘎嘎簡單!
//Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[101],k=0;
while(cin>>n){
a[k++]=n;
}
for(int i=k-1;i>=0;i--){
if(a[i]==0) continue;
cout<<a[i]<<" ";
}
return 0;
}
後面這個也不難,掌握方法就行。
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[101],b[101],k=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=n-1;i>=0;i--){
int x=0;
for(int j=i;j>=0;j--){
if(a[j]<a[i]) x++;
}
b[k++]=x;
}
for(int i=k-1;i>=0;i--){
cout<<b[i]<<" ";
}
return 0;
}
以下內容為作死,慎重使用
P1427 這個題官方給出的演算法標簽是遞歸和棧