C++中计算数字个数,使得数字与其数字之和的差值不小于L


给定一个数字N和另一个数字L。目标是在1到N之间找到那些数字本身与其各位数字之和的差值不小于L的数字。

如果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及之后的所有数字也满足该条件。

如果任何当前中间值满足条件,则中间值和结束值之间的所有数字也满足此条件,因此我们可以简单地将end-mid+1添加到计数中。

  • 将num和L作为长整型变量。

  • 函数Digit_sum(LL num)接受一个数字num并返回其各位数字之和。

  • 将初始和设置为total=0。

  • 使用while循环,将余数num%10添加到total中,并将num减少10。重复此操作,直到num>0。

  • 返回total作为num的各位数字之和。

  • 函数Less_than_L(LL num, LL L)接受一个数字num和一个数字L,并返回数字与其数字之和的差值不小于L的数字个数。

  • 将初始计数设置为0。

  • 使用while循环实现二分查找,其中start=1,end=num。

  • 计算中间数为temp=(start+end)/2。

  • 如果temp与其数字之和的差值不小于L,则所有大于temp的数字也满足相同条件。

  • 包括temp在内的此类数字的个数为num-temp+1。将其添加到计数中。并将end设置为temp-1。

  • 否则,将start设置为temp+1。

  • 在二分查找结束时,count将包含数字与其数字之和的差值不小于L的数字个数。

  • 返回count作为结果。

示例

 在线演示

#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

更新于:2020年12月3日

78 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告