3318:练54.1 6084问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 419 通过数: 300
从这里进入题目:信息学奥赛一本通-编程启蒙(C++版)在线评测系统
【题目描述】
任意给出一个四位数,把它重新组成一个四位的最大数和一个最小数,算出两者间的差。
例如:37213721 这个数,可以重组成:73217321 和 12371237,差值为 7321−12377321−1237。
【输入】
一个四位数。
【输出】
题目中所说的差值。
【输入样例】
3721
【输出样例】
6084
思路:
我想到了一种巧妙的思路
我们首先定义一下long long ls;
这里ls存储的就是输入的数字
我们可以确定ls是四位数,所以我们可以把ls的每一位分离开来(用数组存储):
cpp
long long a[5];
a[1]=ls/1000;
a[2]=ls/100%10;
a[3]=ls/10%10;
a[4]=ls%10;
这里注意了,重点来了!
我们已经将四个位置上的数存在了数组里,那我们现在只需要对数组里的四个数进行排序(从小到大),然后定义一个变量mi,然后mi=a[1]*1000+a[2]*100+a[3]*10+a[4],mi也就是ls能组成的最小的数字,这样我们就能得到最小的数字,最大的数字也可以用类似的方法得出来
那我们怎么排序呢?
不懂的看这里:sort排序-CSDN博客
如果你知道排序这道题应该很简单吧?
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
bool cmp(long long a,long long b){
return a>b;
}
int main(){
long long ls;
cin>>ls;
long long a[5];
a[1]=ls/1000;
a[2]=ls/100%10;
a[3]=ls/10%10;
a[4]=ls%10;
sort(a+1,a+5);
long long mi=a[1]*1000+a[2]*100+a[3]*10+a[4];
sort(a+1,a+5,cmp);
long long ma=a[1]*1000+a[2]*100+a[3]*10+a[4];
ma-=mi;
cout<<ma;
return 0;
}