近似排序......

一年没动算法的蒻蒟随手点开了之前做过的一道【近似排序】,然后开始了,恢复之旅......


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;
}

不出所料的:
image
代码中只对每个数的十位和个位做了排序处理,而当数位多的时候就无法处理了。于是想到了通过获取整数的长度来进行磨运算和除运算。


如何获取整数的长度呢?模糊不清的知识点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;
}

不用提交了一个问题引出十个问题,服了。果断看题解。

posted @ 2024-07-08 15:30  TFLS虎了吧唧  阅读(2)  评论(0编辑  收藏  举报