22行代码AC——例题7-1除法(Division UVa 725)——解题报告
生活随笔
收集整理的這篇文章主要介紹了
22行代码AC——例题7-1除法(Division UVa 725)——解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
勵志用盡量少的代碼做高效的表達
題目(提交)鏈接→UVa-725
題目大意:
0-9不重復的組成兩個5位數,如果數A/數B=n,則為可行解。
思路分析:
本題實質是通過巧妙分析的暴力求解法。
下等解法:直接枚舉0-9的全排列,枚舉量為10!,效率極低。
中等解法:在下等解法的基礎上思考,如果我們只遍歷一個數的5位,判斷該數*n是否小于10W且兩個數中各位是否重復,則最大只需遍歷10^5次。
上等解法:在中等解法的基礎上思考,除數最大不會超過100000/n,最小為1234,則遍歷范圍就縮減為 1234 <= i <= 100000/n。
注意:
1、最后可采用域寬填充0的方法輸出前導0。
2、使用紅黑二叉樹set的去重原理巧妙判斷數字是否重復出現。
代碼:
#include<bits/stdc++.h> using namespace std; int main() {int n, num = 0; //num判斷最后一個輸出結果后有無空格 while((scanf("%d", &n) == 1) && n) {if(num != 0) printf("\n"); num++; //連續的測試用例間需有空行bool flag1 = false; for(int i = 1234; i < (100000/n+1); i++) //縮小范圍 if((i * n) < 100000) {int i1 = i, i2 = i * n; //分別為除數、被除數 set<int>s;for(int k = 0; k < 5; k++ ) {s.insert(i1%10); i1 /= 10; s.insert(i2%10); i2 /= 10;}if(s.size() == 10) {printf("%05d / %05d = %d\n", i*n, i, n); flag1 = true;} }if(!flag1) printf("There are no solutions for %d.\n", n);}return 0; }擇苦而安,擇做而樂,虛擬現實終究比不上真實精彩之萬一。
總結
以上是生活随笔為你收集整理的22行代码AC——例题7-1除法(Division UVa 725)——解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 18行代码AC——PTA 二叉树的遍历
- 下一篇: 12行代码AC——试题 算法训练 猴子吃