历届试题 带分数
历届试题 带分数
时间限制:1.0s 内存限制:256.0MB
问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int a[10],vis[10],ans; int const n=9; __int64 num,num1,num2,num3; __int64 solve(int i,int j) // 从 a数组的第i位到第j位 { __int64 temp=0; for(int k=i;k<=j;k++) temp=temp*10+a[k]; return temp; } void count1()// 该排列 按顺序分为 num1 num2 num3三部分 结果能不能组合成num { int l=1; __int64 temp; temp=num; while(temp=(temp/10)) l++;// num1 的长度 for(int i=0;i<l;i++) { num1=solve(0,i); if(num1>num) return ; for(int j=(n-i)/2;j<=n-(i+1);j++) { num2=solve(i+1,i+j); num3=solve(i+j+1,n-1); //printf("%I64d %I64d %I64d\n",num1,num2,num3); if(num3!=0&&num2>num3&&num2%num3==0&&num==num1+num2/num3) ans++; } } } void dfs(int start,int n) { if(start==n) count1(); for(int i=1;i<=9;i++) { if(vis[i]) continue; a[start]=i; vis[i]=1; dfs(start+1,n); vis[i]=0; } } int main() { while(scanf("%I64d",&num)!=EOF) { memset(vis,0,sizeof(vis)); ans=0; dfs(0,n); printf("%d\n",ans); } return 0; }
来自:http://www.cnblogs.com/assult/archive/2014/02/22.html