【藍橋杯考前突擊】第十屆藍橋杯省賽C/C++大學B組 試題 D 數的分解

螢火~kison發表於2020-10-11
  把 2019 分解成 3 個各不相同的正整數之和,並且要求每個正整數都不包
含數字 2 和 4,一共有多少種不同的分解方法?
  注意交換 3 個整數的順序被視為同一種方法,例如 1000+1001+18 和
1001+1000+18 被視為同一種。
送分題
一眼看過去,不就是個暴力破解嗎
反正也不用在乎時間複雜度
出結果就行了
那我們們就來暴力破解一下(當然dfs也行,不過沒必要啦!)
不過,需要注意
每個正整數不包含2或者4,那麼可以用while框架
交換三個整數的順序視為同一種方法,那麼可以考慮單調遞增
正式開始吧
#include<iostream>
using namespace std;
bool b[2025];
int ans;//記錄最終結果
int main(){
	int a=2019/3;
	//將小於等於2019的所有正整數中含有2或者4的找出來,標記為true; 
	for(int i=1;i<=2019;i++){
		int x=i;
		while(x){
			int y=x%10;
			if(y==2||y==4){
				b[i]=true;
				break;
			}
			x=x/10;
		}
	}
	//為了防止2 3 5和2 5 3這種情況的出現,採用單增的方法,保證每種情況只出現一次 673,1346,2019也可以寫成2019 2019 2019,在這裡都沒關係的,只不過考慮剪枝是種好的程式設計習慣
	for(int i=1;i<673;i++){
		for(int j=i+1;j<1346;j++){
			for(int k=j+1;k<2019;k++){
				if(!b[i]&&!b[j]&&!b[k]&&i+j+k==2019){
					ans++;
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
} 
/*
答案是40785
*/

有問題可以留言交流٩(๑❛ᴗ❛๑)۶

相關文章