logo

幾何級数で足りない数字を見つける

等比数列の要素を順番に表す配列が与えられます。進行に 1 つの要素が欠落しています。欠落している番号を見つけてください。 1 つの用語が常に欠落しており、欠落している用語は系列の最初または最後ではないと想定できます。

例:  

Input : arr[] = {1 3  27 81} Output : 9 Input : arr[] = {4 16 64 1024}; Output : 256

シンプルな解決策 配列を線形に走査し、欠落している数値を見つけることです。この解の時間計算量は O(n) です。



Cプログラミングを含む

アン 効率的なソリューション 二分探索を使用すると、この問題を O(Log n) 時間で解決できます。アイデアは、中間の要素に進むことです。中間と中間の隣の比が公比に等しいかどうかを確認し、そうでない場合は、欠落している要素が Mid と Mid+1 の間にあります。中央の要素が幾何級数の n/2 番目の項に等しい場合 (n を入力配列の要素の数とする)、欠落している要素は右半分にあります。 Else要素は左半分にあります。

実装:

C++
// C++ program to find missing number in // geometric progression #include    using namespace std; // It returns INT_MAX in case of error int findMissingRec(int arr[] int low  int high int ratio) {  if (low >= high)  return INT_MAX;  int mid = low + (high - low)/2;  // If element next to mid is missing  if (arr[mid+1]/arr[mid] != ratio)  return (arr[mid] * ratio);  // If element previous to mid is missing  if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)  return (arr[mid-1] * ratio);  // If missing element is in right half  if (arr[mid] == arr[0] * (pow(ratio mid)) )  return findMissingRec(arr mid+1 high ratio);  return findMissingRec(arr low mid-1 ratio); } // Find ration and calls findMissingRec int findMissing(int arr[] int n) {  // Finding ration assuming that the missing term is  // not first or last term of series.  int ratio = (float) pow(arr[n-1]/arr[0] 1.0/n);  return findMissingRec(arr 0 n-1 ratio); } // Driver code int main(void) {  int arr[] = {2 4 8 32};  int n = sizeof(arr)/sizeof(arr[0]);  cout << findMissing(arr n);  return 0; } 
Java
// JAVA Code for Find the missing number // in Geometric Progression class GFG {    // It returns INT_MAX in case of error  public static int findMissingRec(int arr[] int low  int high int ratio)  {  if (low >= high)  return Integer.MAX_VALUE;  int mid = low + (high - low)/2;    // If element next to mid is missing  if (arr[mid+1]/arr[mid] != ratio)  return (arr[mid] * ratio);    // If element previous to mid is missing  if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)  return (arr[mid-1] * ratio);    // If missing element is in right half  if (arr[mid] == arr[0] * (Math.pow(ratio mid)) )  return findMissingRec(arr mid+1 high ratio);    return findMissingRec(arr low mid-1 ratio);  }    // Find ration and calls findMissingRec  public static int findMissing(int arr[] int n)  {  // Finding ration assuming that the missing  // term is not first or last term of series.  int ratio =(int) Math.pow(arr[n-1]/arr[0] 1.0/n);    return findMissingRec(arr 0 n-1 ratio);  }     /* Driver program to test above function */  public static void main(String[] args)   {  int arr[] = {2 4 8 32};  int n = arr.length;    System.out.print(findMissing(arr n));  }  } // This code is contributed by Arnav Kr. Mandal. 
Python3
# Python3 program to find missing  # number in geometric progression # It returns INT_MAX in case of error def findMissingRec(arr low high ratio): if (low >= high): return 2147483647 mid = low + (high - low) // 2 # If element next to mid is missing if (arr[mid + 1] // arr[mid] != ratio): return (arr[mid] * ratio) # If element previous to mid is missing if ((mid > 0) and (arr[mid] / arr[mid-1]) != ratio): return (arr[mid - 1] * ratio) # If missing element is in right half if (arr[mid] == arr[0] * (pow(ratio mid)) ): return findMissingRec(arr mid+1 high ratio) return findMissingRec(arr low mid-1 ratio) # Find ration and calls findMissingRec def findMissing(arr n): # Finding ration assuming that  # the missing term is not first # or last term of series. ratio = int(pow(arr[n-1] / arr[0] 1.0 / n)) return findMissingRec(arr 0 n-1 ratio) # Driver code arr = [2 4 8 32] n = len(arr) print(findMissing(arr n)) # This code is contributed by Anant Agarwal. 
C#
// C# Code for Find the missing number // in Geometric Progression using System; class GFG {    // It returns INT_MAX in case of error  public static int findMissingRec(int []arr int low  int high int ratio)  {  if (low >= high)  return int.MaxValue;    int mid = low + (high - low)/2;    // If element next to mid is missing  if (arr[mid+1]/arr[mid] != ratio)  return (arr[mid] * ratio);    // If element previous to mid is missing  if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)  return (arr[mid-1] * ratio);    // If missing element is in right half  if (arr[mid] == arr[0] * (Math.Pow(ratio mid)) )  return findMissingRec(arr mid+1 high ratio);    return findMissingRec(arr low mid-1 ratio);  }    // Find ration and calls findMissingRec  public static int findMissing(int []arr int n)  {    // Finding ration assuming that the missing  // term is not first or last term of series.  int ratio =(int) Math.Pow(arr[n-1]/arr[0] 1.0/n);    return findMissingRec(arr 0 n-1 ratio);  }     /* Driver program to test above function */  public static void Main()   {  int []arr = {2 4 8 32};  int n = arr.Length;    Console.Write(findMissing(arr n));  } } // This code is contributed by nitin mittal. 
PHP
 // PHP program to find missing number // in geometric progression // It returns INT_MAX in case of error function findMissingRec(&$arr $low $high $ratio) { if ($low >= $high) return PHP_INT_MAX; $mid = $low + intval(($high - $low) / 2); // If element next to mid is missing if ($arr[$mid+1]/$arr[$mid] != $ratio) return ($arr[$mid] * $ratio); // If element previous to mid is missing if (($mid > 0) && ($arr[$mid] / $arr[$mid - 1]) != $ratio) return ($arr[$mid - 1] * $ratio); // If missing element is in right half if ($arr[$mid] == $arr[0] * (pow($ratio $mid))) return findMissingRec($arr $mid + 1 $high $ratio); return findMissingRec($arr $low $mid - 1 $ratio); } // Find ration and calls findMissingRec function findMissing(&$arr $n) { // Finding ration assuming that the missing  // term is not first or last term of series. $ratio = (float) pow($arr[$n - 1] / $arr[0] 1.0 / $n); return findMissingRec($arr 0 $n - 1 $ratio); } // Driver code $arr = array(2 4 8 32); $n = sizeof($arr); echo findMissing($arr $n); // This code is contributed by ita_c ?> 
JavaScript
<script> // Javascript Code for Find the missing number // in Geometric Progression    // It returns INT_MAX in case of error  function findMissingRec(arrlowhighratio)  {  if (low >= high)  return Integer.MAX_VALUE;  let mid = Math.floor(low + (high - low)/2);    // If element next to mid is missing  if (arr[mid+1]/arr[mid] != ratio)  return (arr[mid] * ratio);    // If element previous to mid is missing  if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)  return (arr[mid-1] * ratio);    // If missing element is in right half  if (arr[mid] == arr[0] * (Math.pow(ratio mid)) )  return findMissingRec(arr mid+1 high ratio);    return findMissingRec(arr low mid-1 ratio);  }    // Find ration and calls findMissingRec  function findMissing(arrn)  {  // Finding ration assuming that the missing  // term is not first or last term of series.  let ratio =Math.floor( Math.pow(arr[n-1]/arr[0] 1.0/n));    return findMissingRec(arr 0 n-1 ratio);  }    /* Driver program to test above function */  let arr=[2 4 8 32];  let n = arr.length;  document.write(findMissing(arr n));    // This code is contributed by rag2127   </script>  

出力
16

時間計算量: O(ログン)

補助スペース: O(ログン)

注記 : このソリューションの欠点は次のとおりです。値が大きい場合や配列が大きい場合、オーバーフローが発生したり、コンピューターのパワーに時間がかかる可能性があります。

文字を int Java に変換

 

クイズの作成