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

C++でL以上の数とその桁の合計の差が生じるような数の数


数Nと別の数Lが与えられます。目標は、数自体とその桁の合計がL以上である1からNまでの数を見つけることです。

N =23、L =10の場合、そのような数の数は4になります。

23-(2 + 3)=18、22-(2 + 2)=18、21-(2 + 1)=18、20-(2 + 0)=18。

上記の数値はすべて条件を満たしています

しかし、19-(1 + 9)=9はLより小さく、同様に18,17….1。

例を挙げて理解しましょう

入力 − n =30 L =19

出力 −数とその桁の合計の差がL以上になるような数の数− 1

説明 − 30のみが条件を満たし、30-(3 + 0)=27> 19

入力 − n =123330 L =5466

出力 −数とその桁の合計の差がL以上になるような数の数− 6841

以下のプログラムで使用されているアプローチは次のとおりです

二分探索を使用して、条件を満たす最初の番号を見つけます。その数がnumの場合、条件はnum+1などにも当てはまります。

現在のmid値のいずれかが条件を満たす場合、midとendの間のすべての数値もこの条件を満たすため、カウントにend-mid+1を追加するだけで済みます。

  • numとLをlong変数とします。

  • 関数Digit_sum(LL num)は、数値numを取り、その桁の合計を返します。

  • 最初の合計をtotal=0とします。

  • whileループを使用して、リマインダーnum%10を合計に追加し、numを10減らします。num>0になるまでこれを行います。

  • 合計をnumの桁の合計として返します。

  • 関数Less_than_L(LL num、LL L)は、数値numと数値Lを取り、数値とその桁の合計の差がL以上になるように数値のカウントを返します

  • 初期カウントを0とします。

  • start=1およびend=numであるwhileループを使用してバイナリ検索を実装します。

  • 中間数をtemp=(start + end)/2として計算します。

  • tempとtempの桁の合計の差がL以上の場合、tempより大きいすべての数値も同じ条件を満たすことになります。

  • tempを含むそのような数のカウントはnum-temp+1になります。これを追加してカウントします。そして、end=temp-1を設定します。

  • それ以外の場合は、start =temp+1を設定します。

  • 二分探索の最後に、カウントはそれらの間に差があり、桁の合計がL以上の数字になります

  • 結果としてカウントを返します。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int Digit_sum(LL num){
   LL total = 0;
   while (num > 0){
      total += num % 10;
      num = num/10;
      z}
   return total;
}
LL Less_than_L(LL num, LL L){
   LL count = 0;
   LL start = 1;
   LL end = num;
   while (start <= end){
      LL temp = (end + start) / 2;
      LL temp_2 = temp - Digit_sum(temp);
      if (temp_2 >= L){
         count = num - temp + 1;
         end = temp - 1;
      }
      else{
         start = temp + 1;
      }
   }
   return count;
}
int main(){
   LL num = 234516;
   LL L = 235;
   cout<<"Count of Numbers such that difference between the number and sum of its digits not
   less than L are: "<< Less_than_L(num, L);
   return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます-

Count of Numbers such that difference between the number and sum of its digits not less than L are: 234267

  1. C ++を使用して、xとその数字の合計が与えられたnと等しくなるような数xを見つけます。

    ここで、1つの問題が発生します。ここで、数値nを取得する場合、x +桁の合計xが指定された数値nと同じになるように、xなどの別の値を見つける必要があります。 nの値が21であると仮定します。このプログラムは、15+桁の合計15、つまり15 + 1 + 5 =21=nとして数値x=15を返します。 この問題を解決するには、単純なアプローチに従う必要があります。 1からnまで繰り返し、各繰り返しで、数値とその桁の合計の合計が数値と同じであるかどうかを確認し、停止します。それ以外の場合は続行します。 例 #include<iostream> using namespace std; i

  2. xとその桁の合計がC++で指定されたnと等しくなるような数xを見つけます

    ここで、1つの問題が発生します。ここで、数値nを取得する場合、x +桁の合計xが指定された数値nと同じになるように、xなどの別の値を見つける必要があります。 nの値が21であると仮定します。このプログラムは、15+桁の合計15、つまり15 + 1 + 5 =21=nとして数値x=15を返します。 この問題を解決するには、単純なアプローチに従う必要があります。 1からnまで繰り返し、各繰り返しで、数値とその桁の合計の合計が数値と同じであるかどうかを確認し、停止します。それ以外の場合は続行します。 例 #include<iostream> using namespace std; i