一、輸入一組整數
這個就是輸入一組整數,數組的話沒法用,因爲數組是定長的,所以我們採用
vector
結合cin.get()
進行判斷。
int input;
vector<int> vec;//vector的好處就在是一個動態數組,我們可以在不指定長度的情況下,輸入任意長度的數字
while(cin>>input){
vec.push_back(input);
if(cin.get()=='\n')
break;
}
二、單鏈表的遞歸逆序輸出
我們在機試中經常遇到單鏈表的逆序輸出的問題,2018北理的機試題中規定必須採用遞歸、鏈表輸出,所以必須得掌握。
void reverse_input_list(node *q){
if(q->next!=NULL)
reverse_input_list(q->next);
cout<<q->data<<" ";
}
在使用的時候,採用頭插或者尾插,建立好鏈表之後把頭結點傳入函數中,就OK了。
三、等腰梯形或者三角形
這也是機試中經常出現的點,雖然不難,但是有時候臨時想還是考驗邏輯能力的。
cin>>n;
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++)
cout<<' ';
for(k=0;k<n+2*i;k++)
cout<<'*';
cout<<endl;
}
四、關於結構體
這一類題經常是以學生信息、成績等爲背景進行考察,這個是一個關於學生成績輸入,統計掛科兩門以上的學生、輸出信息,並按照每個人的掛科數目進行排序輸出,這個難點在成績的不確定。我是在結構體中定義了一個
vector< float> score.
typedef struct Student{
string name;
int no;//學號
vector<float> score;
}student;
下面是具體的輸入信息:
while(cin>>scor){
if(scor == -1)
break;
s[cnt].score.push_back(scor);//cnt是結構體數組,表示第幾個學生。
}
五、字符串中的小數,輸出出來
我們經常遇到需要把一個字符串中的數字輸出出來,可以是整數、小數、正負數(前面有正負號需要帶着正負號)。首先是輸入之後,我們需要進行判斷。
cin>>s;
int i;
for(i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9' || s[i]=='+'||s[i]=='-'){
i=judge(i);//此處是第一次輸入i,經過完整的判斷在
//輸出完這個數字之後,下一個不符合判斷條件的字符的開始
//此處的i的精髓,judge()函數返回的是第一個不符合輸出條件的字符的下標,我們用i接受這個
//下標,對現在的i++再次開始判斷是否符合進入判斷的條件,精髓認真理解。
}
}
接下來就是進行小數、負數、正數、純數字的輸出了,其中還包括類似於+004.500這種數字輸出爲+4.5。
int judge(int i){//這個i是元素的下標。
int flag=1;//負數輸出時,將flag賦值-1,乘上輸出的數。
bool a=false;
double point=1,num=0;//表示點,在查找的過程中,可以將.後面的數字呈上point。
do{//在循環中會一直判斷下一個字符是不是符合要求,.或者數字來操作。
if(s[i]>='0'&&s[i]<='9'){//純數字或者小數的精髓,通過設置point的值來使其不斷*0.1,使得2.3333這種也可以輸出。
if(point>=1){
num=num*10+s[i]-'0';
}
else{
num=num+point*(s[i]-'0');
point*=0.1;//考慮存在2.333這種情況。
}
}
else if(s[i]=='-')
flag *= -1;
else if(s[i]=='+')
a=true;
else if(s[i]=='.')
point*=0.1;
}while(!endof(s[++i])&&i<s.length());
if(a)
cout<<'+';
cout<<num * flag<<' ';
return i-1;//在循環判斷的時候,是判斷符合條件的下一位是不是符合條件,所以i在返回時需要-1.
}
六、關於字符串的拼接問題
這個題是關於全排列的,意思是給a,b,c三個字符,輸入n,加入n=2,那就輸出aa,ab,ac,bb,ba,bc,cc,cb,ca,9最後再輸出一共有幾個,這個題我的思路是,一個string,一個vector< char> v;
if(n==1){
show(v);
return 0;
}
else{
while(--n){
v=fun(v,a);//此處必須帶參數做,例:n=3,其運行情況是先n=2,此時循環結束之後,v中的字符爲aa,ab,ac.....,之後再n--,n=1。
//結果保存了之後返回給v,然後v再作爲參數傳回給fun,
//此時的v是aa,ab,ac.....,然後繼續拼接單個字符,以此類推n=4,n=5...
}
show(v);
}
下面是fun函數,是用了一個返回vector的函數,因爲每次這個返回的vector都要作爲下一次循環的參數進行繼續判斷。
vector<string> fun(vector<string> v,string a){
int i,j;
vector<string> ve;
for(i=0;i<v.size();i++){
for(j=0;j<a.length();j++){
string tem="";//初始化字符串爲空
tem+=v[i];
tem+=a[j];
ve.push_back(tem);
}
}
return ve;
}
七、提取一個整數的每位數
就是在判斷迴文數、水仙花數的時候,我們需要知道輸入數字的每一位,然後進行判斷。
num=n;
len=0;
while(num){
arr[len++]=num%10;//取餘之後的結果存放在arr中,是從低位到高位的存放
num/=10;//每次取餘結束之後,/10,因爲int是向下取整,所以123除10就是12.
}
八、輾轉相除求最大公約數
int gcd(int a,int b){
int t;
if(a<b){///使a大b小
t=b;b=a;a=t;
}
while((t=a%b)!=0){///餘數不爲0時
a=b;///被除數作除數
b=t;///餘數作被除數
}///餘數總是比除數小
return b;///最後整除的除數是最大公約數
}
九、讀寫文件
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main(){
char fname[20]="abc.txt";
ofstream out(abc.txt);
if(out.is_open()){
out<<"Hello,file!"<<endl;
}
char buffer[1024];
ifstream in("abc.txt");
if(!in.is_open()){
cout<<"open file failed!"<<endl;
exit(1);
}
while(!in.eof()){
in.getline(buffer,256);
cout<<buffer<<endl;
}
in.close();
return 0;
}