• POJ 1715


    同样是确定某位上的数,当确定某一位后,其后面的排列数是确定的,所以可以用除法和取余数的方法来确定这一位的值

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int lim[10];
    bool vis[20];
    int ans[20],ansl;
    void initial(){
    	lim[9]=0;
    	lim[8]=486486000;
    	lim[7]=540540000;
    	lim[6]=545945400;
    	lim[5]=546436800;
    	lim[4]=546477750;
    	lim[3]=546480900;
    	lim[2]=546481125;
    	lim[1]=546481140;
    }
    
    int judge(int &n){
    	for(int i=8;i>=1;i--){
    		if(n<=lim[i]){ 
    			n=n-lim[i+1];
    			return i;
    		}
    	}
    }
    
    int getnum(int bt,int hw){
    	int sum=1;
    	for(int i=hw;i>0;i--){
    		sum=sum*bt;
    		bt--;
    	}
    	return sum;
    }
    
    void enAns(int w){
    	for(int i=15;i>=0;i--){
    		if(w==0){
    			if(!vis[i]){
    				ans[ansl++]=i;
    				vis[i]=true;
    				return ;
    			}
    			else{
    				continue;
    			}
    		}
    		else{
    			if(!vis[i]){
    				w--;
    			}
    			else{
    				continue;
    			}
    		}
    	}
    }
    
    void work(int num,int hw){
    	int bt=16;
    	int tmp,word;
    	for(int i=hw-1;i>=0;i--){
    		bt--;
    		tmp=getnum(bt,i);
    		word=num/tmp;
    	//	cout<<word<<endl;
    		num%=tmp;
    		enAns(word);
    	}
    }
    
    int main(){
    	initial();
    	int n;
    	while(scanf("%d",&n)!=EOF){
    		memset(vis,false,sizeof(vis));
    		ansl=0;
    		if(n==546481141){
    			printf("0
    ");
    			continue;
    		}
    		int hw=judge(n);
    		n--;
    	//	cout<<hw<<endl;
    		work(n,hw);
    		for(int i=0;i<ansl;i++){
    			if(ans[i]>=10){
    				printf("%c",ans[i]-10+'A');
    			}
    			else printf("%c",ans[i]+'0');
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    简单的测试用例计划放法
    黑盒测试用例设计方法-等价类划分
    Redis净化板
    爬虫部署与Django
    怎样实现前端的优化
    关于Apache简介笔记
    yield生成器的经典案例
    石头剪刀布
    函数内是否可以修改传递进来的列表
    不定长参数的传递
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/3999055.html
Copyright © 2020-2023  润新知