主题编程实现以下函数功能接口:
int getMostJumps(int *inputArray,int n,int *&outputIndexArray,int m);
输入: n整数不小于0,(n输出:相邻两个数字变化的绝对值,按从大到小的降序排列, 输出前m变化最大的位标,(m 为动态参数),如果变化大小相同,则从位标从小到大排列,如果 如果相邻数字变化的数量小于m,则输出实际数量。函数返回值为 输出数列的数量。:int inputArray[20]=
{5、10、18、9、12、18、9、20、25、22、15、18、9、20、42、33、33、55};
所以相邻的变化 为
{5、8、9、3、6、9、11、5、3、7、3、9、11、20、2、3、0、22};
假设outputArray指向大于m调用数组 getMostJumps(inputArray,20,outputArray,5)应返回5,
outputArray {18,13,15,6,12}
代码
#include "pch.h" #include <map> #include<iostream> #include<string> #include<algorithm> #include<vector> using namespace std; int getMostJumps(int *inputArray, int n, int *&outputIndexArray, int m) { map<double, int >tem; double key; printf("\n输出相邻两个数字的绝对值:\n"); for (int i = 0; i < n-1; i ) { key = abs(inputArray[i 1] - inputArray[i]); printf("%.0lf\t", key); while (tem.find(key) != tem.end()) { key -= (double)1/n;//微调key值,避免丢失相同差值的数据 } tem.insert(make_pair(key, i)); } printf("\n"); int i = 0,j=0; auto iter = tem.end();//此时iter指向尾迭代器的下一个位置 --iter;//此时iter指向尾迭代器 printf("\n按从大到小的降序排列,输出前%d变化最大的位标(%d动态参数:\n",m,m); do { if (i < m) { outputIndexArray[i] = iter->second; printf("%d\t", iter->second); i ; } else { break; } } while (iter-- != tem.begin()); printf("\n"); return i; } int main() { //输入n个不小于0的整数,(n动态可变) vector<int> inp; int *inputArray,*outputArray; int i,result=0; while (true) { printf("以空格分隔,请输入至少2个不小于0的整数,以换" "行结束输入\n下面一行可以复制粘贴\n5 10 32 9 12 18 9 20 25 22 " "15 18 9 20 40 42 30 33 33 55\n\n输入:"); while (1) { cin >> i; inp.push_back(i); if (cin.get() == '\n') break; } if (inp.size() >= 2)break;//2个数以上计算差值 else { printf("输入不符合要求\n\n"); vector <int>().swap(inp); } } int n = inp.size(); inputArray = (int*)malloc(sizeof(int)*n); copy(inp.begin(), inp.end(), inputArray); int m = 5;//m 为动态参数 outputArray = (int*)malloc(sizeof(int)*m); for (int i = 0; i < m; i ) { outputArray[i] = 0; }//初始化outputArray result=getMostJumps(inputArray, n, outputArray, m); printf("\noutputArray此时数组的值为:"); for (int i = 0; i < m;i ) { printf("%d\t", outputArray[i]); } printf("\ngetMostJumps函数返回值为:"); printf("%d\n", result); return 0; }