acwing刷题指南5

//函数

目录:

804. n的阶乘

814. 复制数组

815. 打印字符串

818. 数组排序

816. 数组翻转

821. 跳台阶

804. n的阶乘

输入一个整数 n,请你编写一个函数,int fact(int n),计算并输出n 的阶乘。

输入格式

共一行,包含一个整数 n。

输出格式

共一行,包含一个整数表示 n 的阶乘的值。

输入样例:

3

输出样例:

6

#include<bits/stdc++.h>
using namespace std;
int fact(int n)
{
    if(n <= 1)return n;//保证n是个>1的数
    return n*fact(n-1);
}
int main()
{
    int n;
    cin>>n;
    cout<<fact(n);
    return 0;
}

814. 复制数组

给定两个数组a 和 b 以及一个整数 size,请你编写一个函数,void copy(int a[], int b[], int size),将 a 数组中的前 size 个数字,复制到 b 数组中。

复制完成后,输出 b 数组。

输入格式

第一行包含整数 n,m,size,分别表示 a 数组的长度,b 数组的长度以及整数 size。

第二行包含 n 个整数,表示数组 a。

第三行包含 m 个整数,表示数组 b。

输出格式

共一行,包含m 个整数,表示复制完成后的数组b。

输入样例:

3 5 2
1 2 3
4 5 6 7 8

输出样例:

1 2 6 7 8

#include<bits/stdc++.h>
using namespace std;
void copy(int a[], int b[], int size)
{
    for(int i = 0;i<size;i++)
    {
        b[i] = a[i];
    }
}
int main()
{
    int m,n,size;
    cin>>n>>m>>size;
    int a[n],b[m];
    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;
}

815. 打印字符串

给定一个字符串,请你编写一个函数,void print(char str[]),将这个字符串打印出来。

输入格式

共一行,包含一个字符串。

输出格式

共一行,表示打印出的字符串。

输入样例:

I love AcWing.

输出样例:

I love AcWing.

 第一种:忽视void print(char str[])直接上string

#include<bits/stdc++.h>
using namespace std;
void print(string a)
{
   for(int i = 0;a[i];i++)
   {
      cout<<a[i];
   }
}
int main()
{
    string a;
    getline(cin,a);
    print(a);
    return 0;
}

第二种:或者用原题的办法

#include<bits/stdc++.h>
using namespace std;
void print(char str[])
{
    cout<<str;
}
int main()
{
    char a[101];
    cin.getline(a,101);
    print(a);
    return 0;
}

816. 数组翻转

给定一个长度为 nn 的数组 a 和一个整数 size,请你编写一个函数,void reverse(int a[], int size),实现将数组 a 中的前 size个数翻转。

输出翻转后的数组 aa。

输入格式

第一行包含两个整数 n 和 size。

第二行包含 n个整数,表示数组 a。

输出格式

共一行,包含 n 个整数,表示翻转后的数组 a。

输入样例:

5 3
1 2 3 4 5

输出样例:

3 2 1 4 5

 #include<bits/stdc++.h>
using namespace std;
void reverse(int a[],int size,int n)
{
    for(int i = size;i >= 1;i--)cout<<a[i]<<" ";
    for(int i = size+1;i <= n;i++)cout<<a[i]<<" ";
}
int main()
{
    int n,size;
    cin>>n>>size;
    int a[n+1];
    
    for(int i = 1;i <= n;i++)
    {
        cin>>a[i];
    }
    reverse(a,size,n);
    return 0;
}

818. 数组排序

给定一个长度为 n的数组 a 以及两个整数l 和 r,请你编写一个函数,void sort(int a[], int l, int r),将 a[l]∼a[r] 从小到大排序。

输出排好序的数组 a。

输入格式

第一行包含三个整数 n,l,r。

第二行包含 n 个整数,表示数组 a。

输出格式

共一行,包含 n 个整数,表示排序完成后的数组 a。

输入样例:

5 2 4
4 5 1 3 2

输出样例:

4 5 1 2 3

思路:设定两个函数,a[i]和a[j],比较两者大小,a[j]表示 a[i]后一个数,如果a[j] < a[i]交换值(我们所要做的是需要将小的数排在前面,相当于冒泡排序的思想)

样例解释:5表示输入5个数2表示下标从0开始数,数到第二个数也就是数字1为起点,然后4表示下标从0开始数,数到第四个数也就是数字2,所以就是排1,3,2这三个数

我写的代码为选择排序

#include<bits/stdc++.h>
using namespace std;
void sort(int a[], int l, int r)
{
    for(int i = l;i <= r;i++)
    for(int j = i+1;j <= r;j++)
    if(a[j] < a[i])
    swap(a[i],a[j]);
}
int main()
{
    int n,l,r;
    cin>>n>>l>>r;
    int a[1000];
    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;
}


821. 跳台阶

一个楼梯共有 n 级台阶,每次可以走一级或者两级,问从第 00 级台阶走到第 n 级台阶一共有多少种方案。

输入格式

共一行,包含一个整数n。

输出格式

共一行,包含一个整数,表示方案数。

输入样例:

5

输出样例:

8

思路:看图,我们模拟一个递归搜索树

 

#include<bits/stdc++.h>
using namespace std;
int cnt = 0;
int n;
void fn(int k)
{
    if(k == n) cnt++;
    else if(k < n) 
    {
        fn(k+1);
        fn(k+2);
    }
}
int main()
{
    cin>>n;
    fn(0);//表示Fn这个函数从0开始往下遍历
    cout<<cnt<<endl;
    return 0;

822. 走方格

给定一个 n×m的方格阵,沿着方格的边线走,从左上角 (0,0) 开始,每次只能往右或者往下走一个单位距离,问走到右下角 (n,m) 一共有多少种不同的走法。

输入格式

共一行,包含两个整数 n 和 m。

输出格式

共一行,包含一个整数,表示走法数量。

输入样例:

2 3

输出样例:

10

继续看图,模拟递归树

 

#include<bits/stdc++.h>
using namespace std;
int n,m;
int cnt = 0;
void dfs(int x,int y)
{
    if(x == n &&  y == m)cnt++;
    else 
    {
        if(x < n) dfs(x+1,y);
        if(y < m) dfs(x,y+1);
    }
}
int main()
{
    cin>>n>>m;
    dfs(0,0);
    cout<<cnt<<endl;
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值