1、除法
輸入正整數n,按從小到大的順序輸出所有形如abcde / fghij = n的表示式,其中a~j恰好為0~9的乙個排列,2<=n<=79.
樣例輸入:62
樣例輸出: 79546 / 01283 =62
94736 / 01528 =62
分析: 列舉0~9的所有排列?沒這個必要。只需要列舉fghij就可以算出abcde,然後判斷是否所有數字都不相同即可。不僅程式簡單,而且列舉量也從10!=3628800降低至不到1萬。
#include#includeint main()
else
break;
if(!flag[s2%10])
else
break;
}for(j=0;j<10;j++)
if(!flag[j])
break; /*判斷是否是10個各不相同的數字*/
if(j==10&&i*n<=98765) /*如果數字各不相同*/}}
return 0;
}
2、最大乘積
輸入n個元素組成的序列s,你需要找出乙個乘積最大的的連續子串行。如果這個最大的的乘積不是正數,輸出-1.1<=n<=18,-10<=si<=10;
樣例輸入: 3
2 4 -3 5
2 5 -1 2 -1
樣例輸出:
8 20
分析:連續子串行有兩個要素:起點和終點,因此只需列舉起點和終點即可。由於每個元素的絕對值不超過10,一共又不超過18個元素,最大可能的乘積不會超過10^18,可以用long long 存下。
#include#includeconst int inf=999999;
int main()
for(i=1;i<=n;i++) /*子串行長度*/
}if(max<0)
max=-1;
printf("%lld\n",max);
}return 0;
}
3、分數拆分
輸入正整數k,找到所有的正整數x>=y,使得1/k=1/x + 1/y;
樣例輸入: 2
12樣例輸出: 2
1/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4 8
1/12 = 1/156 + 1/13
1/12 = 1/84 + 1/14
1/12 = 1/60 + 1/15
1/12 = 1/48 + 1/16
1/12 = 1/36 + 1/18
1/12 = 1/30 + 1/20
1/12 = 1/28 + 1/21
1/12 = 1/24 + 1/24
從1/12=1/156+1/13可以看出,x可以比y大很多。由於x>=y,有1/x<=1/y,因此1/k-1/y<=1/y,即y<=2*k.這樣,只需要在2*k範圍之內列舉y,然後根據y嘗試計算出x即可。
#include#includestruct integer
a[10000];
int main()
} printf("%d\n",count);
for(j=0;j4、雙基回文數
如果乙個正整數n至少在兩種不同的進製下b1和b2下都是回文數(2<=b1,b2<=10),則稱n是雙基回文數(注意,回文數不能包含前導零)。輸入正整數s<10^6,輸出比s大的最小的雙基回文數。
樣例輸入: 1600000
樣例輸出: 1632995
分析:最自然的想法就是:從n+1開始依次判斷每個數是否為雙基回文數,而在判斷時列舉所有可能的基數(2~10),一切都是那麼的「暴力」。令人有些意外的是:這樣做對於s<10^6這樣的「小規模資料」來說是足夠快的——雙基回文數太多太密了。
#includeint a[30];
int huiwen(int s,int n) /*判斷是否回文*/
}return 1;
}int converse(int n,int k) /*把十進位制的n轉化為k進製*/
if(huiwen(a,j-1))
flag=1;
if(flag) /*n在k進製下是回文數*/
return 1;
else
return 0;
}int main()
}if(p)}}
return 0;
}
暴力求解法之簡單列舉
列舉是暴力求解法最基本最簡單的一種方法,許多問題通過列舉就能找到解。當然,暴力求解法也不是無腦求解問題,通過對問題的分析減少列舉的規模可以使得演算法更加的簡潔和高效。例1.輸入正整數n,按從小到大的順序輸出所有形如abcde fghij n的表示式,其中a j恰好為數字0 9的乙個排列 可以有前導0...
暴力求解法 簡單列舉
在剛剛開始準備學習些演算法之前,網路上很多演算法高階攻略都會建議先從一些簡單的基本演算法著手入門,其中包括 列舉,貪心,遞迴和分治,遞推,構造,模擬 這些,正好這段時間我在看的劉汝佳的 演算法競賽入門經典 這本書中涉及了很多關於基礎的東西,對於演算法的學習和acm的訓練都很有幫助,所以我打算從 藍書...
暴力求解法 之 列舉排列
1 生成1 n的排列 include includeconst int n 1e3 10 int a n void print permutation int n,int a,int cur int i,j if cur n 遞迴邊界 for i 0 i 2 生成可重集的排列 上面求排列的程式只適用...