一年没动算法的蒻蒟随手点开了之前做过的一道【近似排序】,然后开始了,恢复之旅......
TFLSOJ【近似排序】
看到题目经简单分析后先写出了一种傻瓜解法,(可能叫 暴力??)
#include<bits/stdc++.h>
using namespace std;
int x,y;
int a[110];
int main(){
cin>>x>>y;
for(int i=x,j=1;i<=y;i++,j++){
a[j]=i;
}
for(int i=1;i<=y-x+1;i++){
for(int j=1;j<=y-x+1;j++){
if(a[i]%10<a[j]%10)
swap(a[i],a[j]);
}
}
for(int i=1;i<=y-x+1;i++){
for(int j=i;j<=(y-x)/10;j++){
if(a[i]%10==a[j]%10 && a[i]/10>a[j]/10)
swap(a[i],a[j]);
}
}
for(int i=x,j=1;i<=y;i++,j++){
cout<<a[j]<<endl;
}
return 0;
}
不出所料的:
代码中只对每个数的十位和个位做了排序处理,而当数位多的时候就无法处理了。于是想到了通过获取整数的长度来进行磨运算和除运算。
如何获取整数的长度呢?模糊不清的知识点length(),size(),sizeof().......
好像都不能直接获取整数的长度。于是在百般搜索之下AI给出了一段函数:
int getIntegerLength(int number) {
int length = 0;
do {
length++;
number /= 10;
} while (number != 0);
return length;
}
也就是通过一个数不断除以10直到除尽,记录除了几个10。真是个好办法。。。。。
于是就有了以下代码2.0:
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int x,y;
int a[110];
int ll(int number) {
int l = 0;
do {
l++;
number /= 10;
} while (number != 0);
return l;
}
int main(){
cin>>x>>y;
for(int i=x,j=1;i<=y;i++,j++){
a[j]=i;
}
for(int i=1;i<=y-x+1;i++){
for(int j=1;j<=y-x+1;j++){
int l=pow(10,ll(a[i])-1);
int lj=pow(10,ll(a[j])-1);
if(l!=10){
do{
l+=(l/10);
}while(l%100==0);
}
if(lj!=10){
do{
lj+=(lj/10);
}while(lj%100==0);
}
// cout<<l<<endl<<lj<<endl;
if(l==lj){
if(a[i]%l<a[j]%lj)
swap(a[i],a[j]);
}
else{
if(a[i]%l<(a[j]%(lj*10)))
swap(a[i],a[j]);
}
}
}
for(int i=1;i<=y-x+1;i++){
for(int j=i;j<=(y-x)/(pow(10,ll(a[i])-1));j++){
int l=pow(10,ll(a[i])-1);
int lj=pow(10,ll(a[j])-1);
do{
l+=(l/10);
}while(l%10!=0);
do{
lj+=(lj/10);
}while(lj%10!=0);
if(l==lj){
if(a[i]/l<a[j]/lj)
swap(a[i],a[j]);
}
else{
if(a[i]/l<(a[j]/(lj*10)))
swap(a[i],a[j]);
}
swap(a[i],a[j]);
}
}
for(int i=x,j=1;i<=y;i++,j++){
cout<<a[j]<<endl;
}
return 0;
}
不用提交了一个问题引出十个问题,服了。果断看题解。
标签:10,include,int,......,近似,number,length,排序 From: https://www.cnblogs.com/tflsghh/p/18282259