问题描述:
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
输入:
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
输出:
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
样例输入:
3 3 -4 2
4 0 1 2 -3
0
样例输出:
-4 3 2
-3 2 1 0
分析:
原本想学杭电oj编码2019中的做法,,一边输入一边判断。但是发现过于麻烦,所以就回归正常思路:
1、首先遍历输入的数据,并用不小于100的数组存储。
2、用冒泡排序,重新对数组排序。
3、循环输出所有数据。
其中用到的函数:
使用库函数“cmath”中的abs(int num)函数:
(1)、如果是对整型使用取绝对值,用abs(int number),返回值是也是整型的。
(2)、如果是对double型取绝对值,则用fabs(double number),返回值也是double型。
(3)、如果是对float型取绝对值,则用fabsf(float number),返回值也是float型。
(4)、若果是对long double型取绝对值,则用fabsl(long double number),返回值是long double型。
对冒泡排序法的分析(针对一般而言):
int[] Sort(int *numlist,int n)// 从大到小排序
{
for(int i = 0; i < n - 1; i ++)//使每一个都对它后面所有的数进行比较
{
int temp;
for(int j = i + 1; j < n; j ++)
if(numlist[i] < numlist[j])
{
temp = numlist[i];
numlist[i] = numlist[j];
numlist[j] = numlist[i];
}
}
}
int[] Sort(int *numlist,int n)// 从小到大排序
{
for(int i = n - 1; i > 0; i--)
{
int temp;
for(int j = i - 1; j >= 0; j--)
if(numlist[i] < numlist[j])
{
temp = numlist[i];
numlist[i] = numlist[j];
numlist[j] = numlist[i];
}
}
}
代码:
#include<iostream>
#include<cmath>
using std::cin;
using std::cout;
using std::endl;
int main()
{
int n = 0, num[100] = { 0 }, temp = 0;
while (cin >> n)//输入多组数据
{
if (n > 100 || n == 0)//退出循环的判断
return 0;
for (int i = 0; i < n; i++)//循环输入数据
cin >> num[i];
for (int i = 0; i < n - 1; i++)//冒泡排序法,
for (int j = i + 1; j < n; j++)
if (abs(num[i]) < abs(num[j]))
{
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
for (int i = 0; i < n; i++)//输出所哟的数据
{
if(i == n - 1)//用于最后一个数后输入回车换行
cout << num[i] << endl;
else
cout << num[i] << " ";
}
}
return 0;
}