给定一个正整数n
求这个数进行数位集合重构(使用n所包含的不重复数字几个重新组合)就能得到的最大正整数
eg:输入3839449
输出9843
#include <stdio.h>
int main()
{
int n,i,fre[10] = {0},res = 0;
scanf("%d",&n);
while(n > 0){
fre[n % 10]++;
n /= 10;
}
for(i = 9;i > 0;i--){
if(fre[i] > 0){
res = res * 10 + i;
}
}
printf("%d",res);
return 0;
}
一个又臭又长的实现,供参考:
#include <stdio.h>
int maxNewNum(int n);
int main(void){
int n;
int max;
scanf("%d",&n);
printf("n=%d\n",n);
max = maxNewNum(n);
printf("%d",max);
return 0;
}
int maxNewNum(int n){
int oriNum = n;
int midNum=0;
int arr[32];
int i = 0;
int temp;
int weight=1;
//把整数分解到数组
while(midNum!=oriNum){
temp=n%10;
arr[i]=temp;
n=n/10;
midNum+=temp*weight;
//printf("temp=%d,n=%d,midNum=%d,weight=%d\n",temp,n,midNum,weight);
weight*=10;
i++;
}
//找出不同的数放入数组
int notSameArr[i];
int notSameNum=0;
int same=1;
int j,k;
for(j=0;j<i;j++){
temp=arr[j];
for(k=0;k<notSameNum;k++){
if(temp==notSameArr[k]){
same=0;
}
}
if(same==1){
notSameArr[notSameNum]= temp;
// printf("notSameNum=%d,temp=%d\n",notSameNum,temp);
notSameNum++;
}
same=1;
}
// for(j=0;j<notSameNum;j++){
// printf("notSameArr[%d]=%d\n",j,notSameArr[j]);
// }
//从小到达大排序
for(j=0;j<notSameNum-1;j++){
for(k=j+1;k<notSameNum;k++){
if(notSameArr[j]>notSameArr[k]){
temp=notSameArr[j];
notSameArr[j]=notSameArr[k];
notSameArr[k]=temp;
}
}
}
// for(j=0;j<notSameNum;j++){
// printf("notSameArr[%d]=%d\n",j,notSameArr[j]);
// }
//组成最大的数
int max =0;
weight=1;
for(j=0;j<notSameNum;j++){
max+=weight*notSameArr[j];
// printf("max=%d,weight=%d,notSameArr[%d]=%d\n",max,weight,j,notSameArr[j]);
weight*=10;
}
return max;
}