只有50,不知道为什么判断不了首位相同并且位数不同的情况。。 求助大佬帮忙改进一下代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e2+20;
struct Re{
int x;//输入的数
int y;//输入的数的首位
int z;//输入的数的位数
}a[N];
int n;
bool cmp(Re a,Re b){
if(a.y==b.y&&a.z==b.z) return a.x>b.x;
return a.y>b.y;
}
bool sw=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].x;
int i=1;
int m=1;
while(i<=n){
if(a[i].x/m>=1&&a[i].x/m<10&&a[i].x>=m){
a[i].y=a[i].x/m;
m=1;
i++;
}
else
m=m*10;
}//a[i].y代表对应的a[i].x里的每个数的首位大小
int k=1;
int kk=10;
int l=2;
while(k<=n){
if(a[k].x<10){
a[k].z=1;
k++;
}
if(a[k].x/kk>=1&&a[k].x>=kk&&a[k].x/kk<10){
a[k].z=l;
k++;
kk=10;
l=2;
}
else{
kk=kk*10;
l++;
}
}//a[i].z代表对应的a[i].x里的每个数的位数大小
int ans=0;
int anss=0;
sort(a+1,a+n+1,cmp);//按照首位从大到小排好序
for(int i=1;i<n;i++){
if(a[i].y!=a[i+1].y)
anss++;
if(anss==n-1)
goto sc;
}
i=1;
while(i<=n){
if(a[i].y==a[i+1].y){
int x=a[i].x;
int xx=a[i+1].x;
int y=a[i].y;
int yy=a[i+1].y;
int z=a[i].z;
int zz=a[i+1].z;
//x代表首位相同的数中的第一个数
//xx代表首位相同的数中的第二个数
//y代表首位相同的数中的第一个数的首位
//yy代表首位相同的数中的第二个数的首位
//z代表首位相同的数中的第一个数的位数
//zz代表首位相同的数中的第二个数的位数
while(y==yy){
int f=1,ff=1;
int op=2,po=2;
int m=1;
sw=0;
while(op<z){
f=f*10;
op++;
}
while(po<zz){
ff=ff*10;
po++;
}
x=x-y*z*f;
xx=xx-yy*ff;
z--;
zz--;
m=1;
while(1){
if(x/m>=1&&x/m<10&&x>=m){
y=x/m;
break;
}
else
m=m*10;
}
m=1;
while(1){
if(xx/m>=1&&xx/m<10&&xx>=m){
yy=xx/m;
break;
}
else
m=m*10;
}
if(y<yy)
sw=1;
}
if(sw==1){
ans=a[i].x;
a[i].x=a[i+1].x;
a[i+1].x=ans;
}
}
i++;
}
sc:for(int i=1;i<=n;i++)
cout<<a[i].x;
return 0;
for(int i=1;i<=n;i++)
cout<<a[i].x;
return 0;
}