第1关:快速排序
任务描述
本关任务:编写快速排序算法,能够对数组进行快速排序。
相关知识
为了完成本关任务,你需要掌握:递归的基本思想,快速排序的方法。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
#include<iostream>
using namespace std;
void print(int a[], int n)
{
for(int j= 0; j<n; j++)
{
cout<<a[j] <<" ";
}
}
void quickSort(int a[], int low ,int high)
{
/********************begin***********************/
if(low>=high){
return;
}
int temp;
int i=low+1;
int pivot=a[low];
for(int j=low+1 ; j<=high; j++){
if (a[j]<pivot) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
}
}
temp=a[low];
a[low]=a[i-1];
a[i-1]=temp;
quickSort(a,low,i-2);
quickSort(a,i,high);
/********************end *************************/
}
int main()
{
int n;
cin>>n;
int *a = new int[n];
for (int i=0;i<n;i++)
{
cin>>a[i];
}
/********************begin***********************/
quickSort(a,0,n-1);
print(a,n);
/********************end *************************/
}
第2关:归并排序
任务描述
本关任务:归并排序。 ####相关知识 为了完成本关任务,你需要掌握归并排序知识。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入: 30
62 42 73 23 43 91 86 99 21 70 80 11 52 43 18 3 48 22 41 44 37 18 92 23 66 50 80 36 58 23
预期输出: 3 11 18 18 21 22 23 23 23 36 37 41 42 43 43 44 48 50 52 58 62 66 70 73 80 80 86 91 92 99
#include<iostream>
using namespace std;
//归并过程
void merge(int arr[], int l, int mid, int r){
/********begin************/
int i,j,k;
int n1=mid-l+1;
int n2=r-mid;
int L[n1],R[n2];
for(int i=0 ; i<n1; i++){
L[i]=arr[l+i];
}
for(int j=0 ; j<n2; j++){
R[j]=arr[mid+1+j];
}
i=0;
j=0;
k=l;
while(i<n1&& j<n2){
if(L[i]<=R[j]){
arr[k]=L[i];
i++;
}
else{
arr[k]=R[j];
j++;
}
k++;
}
while(i<n1){
arr[k]=L[i];
i++;
k++;
}
while(j<n2){
arr[k]=R[j];
j++;
k++;
}
/********end**************/
}
//递归
static void mergeSort(int arr[], int l, int r){
/********begin************/
if(l<r){
int mid=l+(r-l)/2;
mergeSort(arr,l,mid);
mergeSort(arr,mid+1,r);
merge(arr,l,mid,r);
}
/********end**************/
}
//归并排序整个数组
void mergeSort(int arr[], int n){
//如果数组为空或只有一个元素,不需要排序
if(arr == NULL || n < 2){
return;
}
mergeSort(arr,0,n-1);
}
int main(){
int n;
cin >> n;
int arr[n];
for(int i = 0; i < n; i++) cin >> arr[i];
mergeSort(arr, n);
for(int i = 0; i < n; i++){
cout << arr[i] << " ";
}
return 0;
}
第3关:整数因子分解
任务描述
本关任务:整数因子分解问题。
相关知识
大于1
的正整数n
可以分解为:n=x1*x2*…*xm
。例如,当n=12
时,共有8
种不同的分解式:
12=12;
12=6*2;
12=4*3;
12=3*4;
12=3*2*2;
12=2*6;
12=2*3*2;
12=2*2*3。
对于给定的正整数n
,计算n
共有多少种不同的分解式。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
输入输出: Input
输入数据只有一行,有1
个正整数n
(1≤n≤2000000000
)。
Output
将计算出的不同的分解式数输出。
Sample Input
12
Sample Output
8
注意:1.代码中ff[N]作为全局变量了,所以在函数体里面不用重新声明。2、请注意代码的效率。
#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
int ff[N];
int f(int n)
{
/**********begin****************/
int ans=0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
if(n/i==i)ans+=f(i);
else{
ans+=f(i);
ans+=f(n/i);
}
}
}
return ans+1;
/**********end******************/
}
int main()
{
int n;
scanf("%d", &n);
memset(ff, 0, sizeof(ff));
printf("%d", f(n));
return 0;
}