一年没动算法的蒻蒟随手点开了之前做过的一道【近似排序】,然后开始了,恢复之旅......
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;
}
不用提交了一个问题引出十个问题,服了。果断看题解。