帶分數--第四屆藍橋杯省賽C++ B組--隨筆記錄

題目描述
100 可以表示爲帶分數的形式:100=3+69258/714
還可以表示爲:100=82+3546/197
注意特徵:帶分數中,數字 1∼9 分別出現且只出現一次(不包含 0)。
類似這樣的帶分數,100 有 11 種表示法。
輸入格式
一個正整數。

輸出格式
輸出輸入數字用數碼 1∼9 不重複不遺漏地組成帶分數表示的全部種數。

數據範圍
1≤N<106
輸入樣例1:
100
輸出樣例1:
11
輸入樣例2:
105
輸出樣例2:
6

AC代碼:

/*
1.n = a + b/c;
2.全排列9個數字
3.分段,割成三段,分別對應a, b, c
4.判斷 
*/ 
#include <cstdio>
#include <iostream>

using namespace std;

int count = 0;//記錄多少中表示方法 
int nums[9];//存儲全排列 
int N,a,b,c;
int used[9];//代表這個數字是否使用

int cal(int left, int right)
{
	int num = nums[left];
	while(left < right)
	{
		num = num * 10 + nums[++left];
	}
	return num;
}
void dfs(int index)//枚舉到第index位置 
{
	if(index == 9)
	{
		//枚舉到第9個位置,說明枚舉完成,分割
		//1 2 3 4 5 6 7 8 9
		//分割,i代表第一道分割線,最多包含7,即第六個位置 
		//分割,j代表第二道分割線 ,最多包含8,即第七個位置 
		for(int i = 0; i < 7; i++)
		{
			for(int j = i + 1; j < 8; j++)
			{
				a = cal(0,i);
				b = cal(i+1,j);
				c = cal(j+1,8);
				
				//判斷是否滿足
				//先判斷b能否整除c
				//在判斷相加結果
				if(N*c == a*c + b)
					count++;
			}
		}
		return;
	}
	
	for(int i = 1; i <= 9; i++)
	{
		if(!used[i])
		{
			used[i] = 1;
			nums[index] = i;
			dfs(index + 1);
			used[i] = 0;;
		}
	}
}

int main()
{
	scanf("%d", &N);
	dfs(0);
	printf("%d", count);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章