第1关:快速排序
100
- 任务要求
- 参考答案
- 评论6
- 任务描述
- 相关知识
- 编程要求
- 测试说明
任务描述
本关任务:编写快速排序算法,能够对数组进行快速排序。
相关知识
为了完成本关任务,你需要掌握:递归的基本思想,快速排序的方法。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
开始你的任务吧,祝你成功!
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[111111]; void f(int l,int r) { int i,j,t,temp; if(l>r) return; temp=a[l]; i=l,j=r; while(i!=j) { while(a[j]>=temp&&i<j) j--; while(a[i]<=temp&&i<j) i++; if(i<j) swap(a[i],a[j]); } a[l]=a[i]; a[i]=temp; f(l,i-1); f(i+1,r); } int main() { int l,i,j,k,n; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); f(1,n); printf("%d",a[1]); for(i=2;i<=n;i++) printf(" %d",a[i]); printf(" "); } }
第2关:归并排序
100
- 任务要求
- 参考答案
- 评论6
- 任务描述
- 编程要求
- 测试说明
任务描述
本关任务:归并排序。 ####相关知识 为了完成本关任务,你需要掌握归并排序知识。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:
开始你的任务吧,祝你成功!
#include<iostream> using namespace std; //归并过程 void merge(int arr[], int l, int mid, int r){ //定义左右两个数组left[]和right[] int n1 = mid - l + 1; int n2 = r - mid; int left[n1], right[n2]; //将元素分别存入left[]和right[]中 for(int i = 0; i < n1; i++){ left[i] = arr[l + i]; } for(int j = 0; j < n2; j++){ right[j] = arr[mid + 1 + j]; } //初始化i、j、k int i = 0, j = 0, k = l; //将较小的元素依次放入存放排序结果的数组中 while(i < n1 && j < n2){ if(left[i] <= right[j]){ arr[k++] = left[i++]; } else{ arr[k++] = right[j++]; } } //将left[]或right[]中还有剩余的元素全部放入存放排序结果的数组中 while(i < n1){ arr[k++] = left[i++]; } while(j < n2){ arr[k++] = right[j++]; } } //递归 static void mergeSort(int arr[], int l, int r){ if(l >= r){ //递归终止条件 return; } int mid = (l + r) / 2; //计算中间索引 mergeSort(arr, l, mid); //对左半部分进行递归排序 mergeSort(arr, mid+1, r); //对右半部分进行递归排序 merge(arr, l, mid, r); //归并两个子数组 } //归并排序整个数组 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关:整数因子分解
100
- 任务要求
- 参考答案
- 评论6
- 任务描述
- 相关知识
- 编程要求
- 测试说明
任务描述
本关任务:整数因子分解问题。
相关知识
大于
对于给定的正整数
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
输入输出:
输入数据只有一行,有
将计算出的不同的分解式数输出。
注意:1.代码中ff[N]作为全局变量了,所以在函数体里面不用重新声明。2、请注意代码的效率。
开始你的任务吧,祝你成功!
#include <bits/stdc++.h> using namespace std; const int N = 100000; int ff[N]; int f(int n) { int sum = 1; if(n < N && ff[n] != 0) return ff[n]; for(int i = 2; i <= sqrt(n); i++) { if(n % i == 0) { if(i * i == n) sum += f(i); else sum += f(i) + f(n / i); } } if(n < N) ff[n] = sum; return sum; } int main() { int n; scanf("%d", &n); memset(ff, 0, sizeof(ff)); printf("%d", f(n)); return 0; }