日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯B组 杨辉三角

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯B组 杨辉三角 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目分析

這道題得斜著看,可以發現如下規律:

1.題目要求的是N第一次出現的數字,那么左邊的優先于右邊的,所以可以只看一半。

2.搜索順序:在下的斜行優于在上的斜行

3.C(16,32)< 10^9 < C(17,34) ,故我們搜索的斜行枚舉到16即可,通過 C(k , 2k)在計算機上試一下即可知道。

4.通過一個循環來枚舉每一斜行,每個斜行用二分法來檢索N

5.還需要一個方法來求C( n , k ),這個直接求解即可,先分子除以分母,在乘到總數里

6.輸出:通過觀察可發現在 C(n,k) 這?之前有n行,既有(1+n)*n / 2 個數,該數在該行的第 K+1 個,即該數第一次出現是在 (1+n)*n / 2 + K + 1 個數。

import java.util.*; class Main{static int n;static long c(long a,long b) {long res=1;for(long i=a,j=1;j<=b;j++,i--) {res=res*i/j;//先除在乘起來,不然會爆//該方法用在了check中,為了比較c(mid,k)與n的大小,一旦大于n結果自然知曉,也無需在往下計算 if(res>n) return res;}//System.out.println("c: "+res);return res;}static boolean check(int k) {//System.out.println("k1: "+k);long l=2*k,r=n;long res=0;while(l<=r) {//System.out.println("k2: "+k);long mid=l+r>>1;res=c(mid,k); if(res>n) r=mid-1;else if(res<n) l=mid+1;else {//if(n<2*k) return false;//n要大于2KSystem.out.println((mid+1)*mid/2+k+1);return true;}}return false;}public static void main(String args[]) {Scanner scan=new Scanner(System.in);n=scan.nextInt();for(int k=16;k>=0;k--) {if(check(k))break;}} }

反思

1.要注重臨界值的判斷,例如此處的 l <= r,當 n 就是該斜行中的最大值時,最終 l=mid=r,所以循環條件應該是 l <= r。若為 l < r,那么當 l = r 時就退出循環導致查找失敗。?

2.當 n < 2k 時,n一定小于 C(k,2k) ,則沒必要進行該斜行的檢索,也不會進入循環,也達到了一個篩選的作用。

總結

以上是生活随笔為你收集整理的蓝桥杯B组 杨辉三角的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。