带分数 全排列和枚举

# include <cstdio>
# include <cmath>
# include <algorithm>
using namespace std;
int n, s[10];
int main(){
	int i, j, k, a, b, c, ans;
	scanf("%d", &n);
	ans=0;
	for(i=0; i<=8; i++){
		s[i]=i+1;
	}
	do{
		a=0;
		for(i=0; i<=6; i++){
			a=10*a+s[i];
			if(a>=n){
				break;
			}
			b=0;c=0;
			for(j=i+1; j<=(8-i+1)/2+i; j++){//因为b>c所以b取剩下的数目至少一半。
				b=b*10+s[j];
			}
			for(j=(8-i+1)/2+i+1; j<=8; j++){//b取完后剩下的给c 
				c=c*10+s[j];
			}
			if(b>c&&b%c==0&&a+b/c==n){
				ans++;
			}
		    for(k=(8-i+1)/2+i+1; k<=7; k++){//动态改变b,c 
		    	b=b*10+s[k];c=c-s[k]*(int)pow(10, 8-k);
		    	if(b%c==0&&a+b/c==n){
		    		ans++;
				}
			}
		}
	}while(next_permutation(s, s+9));
	printf("%d", ans);
	return 0;
}
posted @ 2017-03-30 16:58  地对地导弹2  Views(109)  Comments(0)    收藏  举报