C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

削除する桁の位置を印刷して、C++で数値を6で割り切れるようにします


この問題では、番号が与えられ、番号からさらに数字を削除する必要があります。削除後に形成された新しい数が6で割り切れるようにします。

概念をよりよく学ぶために例を見てみましょう-

Input : 1324
Output : 4

説明 − 4番目の数値を削除すると、6で割り切れる132が得られます。

ここでは、番号が与えられており、番号を6で割り切れるようにするには、番号を削除した位置を返す必要があります。

この問題を解決するために、問題を解決するロジックを作成しようとします。このために、数値が2と3で割り切れる場合、それは6で割り切れるという知識を使用します。

数字から数字を削除した後、形成された新しい数字は、6の除算、つまり2と3の両方の除算についてチェックされます。

アプローチ

数字に基づいて、数字を削除して作成された数字が6で割り切れるかどうかを確認できます。数字の最後の桁を見ると、2つの条件が発生します。

最後の桁が奇数の場合

最後の桁が奇数の場合、可能な唯一の方法は最後の桁を削除することです。また、最後の桁の隣の桁が偶数の場合にのみ、新しい数値は6で割り切れません。そうでなければ、解決策は不可能です。

最後の桁が偶数の場合

最後の桁が偶数の場合、数値を3で割ったときの余りを見つける必要があります。この数値に基づいて、どの桁を削除できるかを確認できます。

数を3つの3つのケースで割ると-

余りは1です −除算の余りが1の場合、1、4、7の数字のいずれかを配列から削除できます。複数の数字を削除できる場合は、削除後に形成される数字が最大になるように数字を削除します。

余りは2です −除算の余りが2の場合、2、5、8の数字のいずれかを配列から削除できます。複数の数字を削除できる場合は、削除後に形成される数字が最大になるように数字を削除します。

余りは3です −除算の余りが1の場合、3、6、9の数字のいずれかを配列から削除できます。複数の数字を削除できる場合は、削除後に形成される数字が最大になるように数字を削除します。

これらに基づいて、いくつかの問題を解決し、目的の出力を見つけましょう-

最後の桁が奇数の場合

1。 34241341

この場合、削除できるのは最後の位置から1の数字だけで、形成される数値は6で割り切れる3432134になります。したがって、削除された1の位置、つまり8を返します。

2。 3214241

この場合、削除できる数字は最後の位置から1であり、形成される数値は341224になります。これは6で割り切れないため、-1を返します。

最後の桁が偶数の場合

1。 8097860

この場合、数を3で割って、2に等しい余りを見つける必要があります。したがって、余りが2の場合、数から2、5、8を削除できます。したがって、位置1と5から8を削除して、数値を2で割り切れるようにすることができます。1番目の位置から8を削除すると、より小さな数値が返されるため、5番目の位置から8を削除します。形成される新しい番号は、6で割り切れる809760になります。したがって、5を返します。

このロジックに基づいて、問題を解決するためのプログラムを作成しましょう-

#include <bits/stdc++.h>
using namespace std;
void isDivisibleBy6(string num){
   int n = num.length();
   int a[n];
   int sum = 0;
   for (int i = 0; i < n; i++) {
      a[i] = num[i] - '0';
      sum += a[i];
   }
   if (a[n - 1] % 2){
      if ( (a[n - 2] % 2 != 0) || (sum - a[n - 1]) % 3 != 0) {
         cout << "-1" << endl;
      }
      else {
         cout << n << endl;
      }
   }
   else {
      int re = sum % 3;
      int del = -1;
      int flag = 0;
      for (int i = 0; i < n - 1; i++) {
         if ((a[i]) % 3 == re) {
            if (a[i + 1] > a[i]) {
               del = i;
               flag = 1;
               break;
            }
            else {
               del = i;
            }
         }
      }
      if (flag == 0) {
         if (a[n - 2] % 2 == 0 and re == a[n - 1] % 3)
            del = n - 1;
      }
      if (del == -1)
         cout << -1 << endl;
      else {
         cout << del + 1 << endl;
      }
   }
}
int main(){
   string number = "343224152";
   isDivisibleBy6(number);
   return 0;
}

出力

5

  1. Xで割り切れる最大のK桁の数値のC++プログラム?

    この問題では、Xで割り切れる最大のK桁の数を見つけようとします。このタスクを実行するには、この式((10 ^ k)– 1)で最大のK桁の数を取得します。次に、数値がXで割り切れるかどうかを確認します。割り切れない場合は、この数式を使用して正確な数値を取得します。 𝑚𝑎𝑥−(𝑚𝑎𝑥 𝑚𝑜𝑑 𝑋) 1つの例は、29で割り切れる5桁の数字のようなものです。したがって、最大の5桁の数字は99999です。これは29で割り切れません。ここで、式を適用すると、-が得られます。 99999−(99999 𝑚𝑜𝑑 29)=99999−7=99992

  2. Xで割り切れる最小のK桁の数字のためのC++プログラム?

    この問題では、Xで割り切れる最小のK桁の数を見つけようとします。このタスクを実行するには、この式(10 ^(k-1))で最小のK桁の数を取得します。次に、数値がXで割り切れるかどうかを確認します。割り切れない場合は、この数式を使用して正確な数値を取得します。 (min+ 𝑋)−((min+ 𝑋) 𝑚𝑜𝑑 𝑋) 1つの例は、29で割り切れる5桁の数字のようなものです。したがって、最小の5桁の数字は10000です。これは29で割り切れません。ここで、式を適用すると、-が得られます。 (10000+ 29)−((10000+29) 𝑚𝑜𝑑 29)=1002