C,C++语法基础 | 函数 | 06

函数 | 06

函数部分的基础知识大部分都已经掌握,主要以习题为主.

n的阶乘

#include<iostream>
using namespace std;


int fact(int n){
    int res = 1;
    for(int i=1;i<=n;i++)res *= i;
    return res;
}

int main(){
    int n;
    cin >> n;
    cout << fact(n) << endl;
    
    return 0;
}

x和y的最大值

#include<iostream>
using namespace std;

int max(int x,int y){
    return x > y ? x : y;
}

int main(){
    int x,y;
    cin >> x >> y;
    cout << max(x,y) << endl;
    
    return 0;
}


最大公约数

#include<iostream>
using namespace std;

int gcd(int a,int b){
    if(b==0){
        return a;
    }
    return gcd(b,a%b);
}


int main(){
    int a,b;
    cin >> a >> b;
    cout << gcd(a,b) << endl;
    return 0;
}

交换数值

#include<iostream>
using namespace std;

void swap(int &a,int &b){ // 这里使用引用&是因为在函数的内外都需要变化
    if(a==b)return;
    int t = a;
    a=b,b=t;
}


int main(){
    int a,b;
    cin >> a >> b;
    swap(a,b);
    cout << a << " " << b << endl;
    
    return 0;
}

打印数字

#include<iostream>
using namespace std;


void print(int a[],int size){
    for(int i=0;i<size;i++)cout << a[i] << " ";
}

int a[1010];
int main(){
    int size,n;
    cin >> n >> size;
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    print(a,size);
    return 0;
}

打印矩阵

#include<iostream>
using namespace std;

const int N = 110;
void print2D(int a[][N],int row,int col){
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            cout << a[i][j] << " " ;
        }
        cout << endl;
    }
}

int a[N][N];
int main(){
    int r,c;
    cin >> r >> c;
    for(int i=0;i<r;i++){
        for(int j=0;j<c;j++){
            cin >> a[i][j];
        }
    }
    print2D(a,r,c);
    
    return 0;
}

递归求阶乘

#include<iostream>
using namespace std;


int fact(int n){
    if(n==1)return 1;
    return n*fact(n-1);
}

int main(){
    int n;
    cin >> n;
    cout << fact(n) << endl;
    
    return 0;
}

递归求斐波那契数列

#include<iostream>
using namespace std;

int fib(int n){
    if(n==1 || n == 2) return 1;
    return fib(n-1) + fib(n-2);
    
}


int main(){
    int n;
    cin >> n;
    cout << fib(n) << endl;
    
    return 0;
}

绝对值

#include<iostream>
using namespace std;

int abs(int x){
    if(x>0)return x;
    return -x;
}


int main(){
    int x;
    cin >> x;
    cout << abs(x) << endl;
}

两个数的和

#include<iostream>
using namespace std;

double add(double a,double b){
    return a + b;
}

int main(){
    double a,b;
    cin >> a >> b;
    printf("%.2lf",add(a,b));
    
    return 0;
}

区间求和

#include<iostream>
using namespace std;


int sum(int l,int r){
    int res = 0;
    for(int i=l;i<=r;i++)res +=i;
    return res;
}


int main(){
    int l,r;
    cin >> l >> r;
    cout << sum(l,r) << endl;
    
    return 0;
}

最小公倍数

#include<iostream>
using namespace std;

int gcd(int a,int b){
    if(b==0)return a;
    return gcd(b,a%b);
}

int lcm(int a,int b){
    return a*b / gcd(a,b);
}

int main(){
    int a,b;
    cin >> a >> b;
    cout << lcm(a,b) << endl;
    
    return 0;
}

复制数组

#include<iostream>
using namespace std;

const int N = 110;
int a[N],b[N];

void copy(int a[], int b[], int size){
    for(int i=0;i<size;i++){
        b[i] = a[i];
    }
}


int main(){
    int n,m,size;
    cin >> n >> m >> size;
    for(int i=0;i<n;i++) cin >> a[i];
    for(int i=0;i<m;i++) cin >> b[i];
    copy(a,b,size);
    for(int i=0;i<m;i++){
        cout << b[i] << " ";
    }
    return 0;
}

打印字符串

#include<iostream>
using namespace std;

void print(char str[]){
    printf("%s",str);
}

int main(){
    char s[100];
    fgets(s,200,stdin);
    print(s);
    return 0;
}

数组翻转

#include<iostream>
using namespace std;

int a[1010];

void reverse(int a[], int size){
    int l=0,r=size-1;
    while(l < r){
        swap(a[l],a[r]);
        l++,r--;
    }
}

int main(){
    int n,size;
    cin >> n >> size;
    for(int i=0;i<n;i++)cin >> a[i];
    reverse(a,size);
    for(int i=0;i<n;i++)cout << a[i] << " ";
    
    return 0;
}

数组去重

#include<iostream>
using namespace std;

const int N = 1010;


int unique(int a[], int size){
    int cnt = 0;
    for(int i=0;i<size;i++){
        bool is_exist = false;
        for(int j=i+1;j<size;j++){
            if(a[i] == a[j]){
                is_exist = true;
                break;
            }
        }
        if(!is_exist)cnt++;
    }

    return cnt;
}


int main(){
    int a[N],n,size;
    cin >> n >> size;
    for(int i=0;i<size;i++)cin >> a[i];
    cout << unique(a,size) + (n - size) << endl;
    
    return 0;
}

关于去重,如果不借助容器,那么就是两重循环. 如果借助容器,就只需要一重循环.

// 去重是往数组前面看或者往数组后面看其实都可以
    for(int i=0;i<size;i++){ 
        bool is_exist = false;
        for(int j=i+1;j<size;j++){ // 向后面看
            
    for(int i=0;i<size;i++){
        bool is_exist = false;
        for(int j=0;j<i;j++){ // 向前面看            

数组排序

#include<iostream>
using namespace std;


const int N = 1010;

void sort(int a[], int l,int r){ // 这里数组直接传递的就是地址
    // 插入排序
    for(int i=l+1;i<=r;i++){
        int j = i;
        while(j>l && a[j] < a[j-1])swap(a[j],a[j-1]),j--;
    }
}


int main(){
    int n,l,r,a[N];    
    cin >> n >> l >> r;
    for(int i=0;i<n;i++)cin >> a[i];
    sort(a,l,r);
    for(int i=0;i<n;i++)cout << a[i] << " ";
    
    return 0;    
}

C++方法中传递的数组直接就是传递的数组地址,这个注意了,不需要引用&,只有变量才需要引用&

跳台阶

#include<iostream>
using namespace std;

int f(int n){
    if(n<0)return 0;
    if(n==0)return 1;
    return f(n-1) + f(n-2);
}

int main(){
    int n;
    cin >> n;
    cout << f(n) << endl;
    
    
}

这是一道非常经典的递归题目,就是用来锻炼递归能力的. 然后这个跳台阶题目的本质就是斐波那契数列.

首先是有几种相似的选择,然后考虑边界.

走方格

#include<iostream>
using namespace std;


int f(int n,int m){
    if(n<0 || m<0)return 0;
    if(n==0 && m == 0)return 1;
    return f(n-1,m) + f(n,m-1);
}

int main(){
    int n,m;
    cin >> n >> m;
    cout << f(n,m) << endl;
    
    return 0;
}

走方格,也是一个非常经典的练手递归的题目.

如果不清楚还是先画出一个递归搜索树出来.可是是正序也可以是反序,结果都是一样的.

排列

排列

#include<bits/stdc++.h>
using namespace std;


// 这种dfs都设置全局变量和全局数组反而更加方便
int n;
int a[20]; // 待选择的数字最好用一个数组存起来
bool vis[20]; // 判重数组
int res[20]; // 存储结果的数组


void dfs(int u){
    if(u == n){
        for(int i=0;i<n;i++){
            cout << res[i] << " ";
        }
        cout << endl;
        return;
    }
    for(int i=0;i<n;i++){
        if(!vis[i]){
            vis[i] = true;
            res[u] = a[i];
            dfs(u+1);
            vis[i] = false;
            res[u] = 0;
            
        }
    }
}


int main(){
    cin >> n;
    for(int i=0,j=1;j<=n;i++,j++){
        a[i] = j;
    }
    dfs(0);
    
    return 0;
}

排列也是很典型的问题,必会问题.

posted @ 2020-11-04 10:32  RowryCho  阅读(188)  评论(0编辑  收藏  举报