给定正值N,我们需要找到小于N的数字计数,以使数字与数字总和之间的差大于或等于给定的特定值diff。
例子:
Input : N = 13, diff = 2
Output : 4
Then 10, 11, 12 and 13 satisfy the given
condition shown below,
10 – sumofdigit(10) = 9 >= 2
11 – sumofdigit(11) = 9 >= 2
12 – sumofdigit(12) = 9 >= 2
13 – sumofdigit(13) = 9 >= 2
Whereas no number from 1 to 9 satisfies
above equation so final result will be 4
我们可以通过观察以下事实来解决此问题:对于小于N的数k,
if k – sumofdigit(k) >= diff then
above equation will be true for (k+1)
also because we know that sumofdigit(k+1)
is not greater than sumofdigit(k) + 1
so, k + 1 - sumofdigit(k + 1) >=
k - sumofdigit(k)
but we know that right side of above
inequality is greater than diff,
so left side will also be greater than
diff.
因此,最后我们可以说,如果数k满足差分条件,那么(k +1)也将满足相同的方程式,因此我们的工作是找到满足差分条件的最小数字,然后所有大于此数字且最大为N的数字将满足条件,因此我们的答案将为N –我们找到的最小数字。
我们可以使用二进制搜索找到满足此条件的最小数字,因此求解的总时间复杂度将为O(log N)
C/C++
/* C++ program to count total numbers which
have difference with sum of digits greater
than specific value */
#include
using namespace std;
// Utility method to get sum of digits of K
int sumOfDigit(int K)
{
// loop until K is not zero
int sod = 0;
while (K)
{
sod += K % 10;
K /= 10;
}
return sod;
}
// method returns count of numbers smaller than N,
// satisfying difference condition
int totalNumbersWithSpecificDifference(int N, int diff)
{
int low = 1, high = N;
// binary search while loop
while (low <= high)
{
int mid = (low + high) / 2;
/* if difference between number and its sum
of digit is smaller than given difference
then smallest number will be on left side */
if (mid - sumOfDigit(mid) < diff)
low = mid + 1;
/* if difference between number and its sum
of digit is greater than or equal to given
difference then smallest number will be on
right side */
else
high = mid - 1;
}
// return the difference between 'smallest number
// found' and 'N' as result
return (N - high);
}
// Driver code to test above methods
int main()
{
int N = 13;
int diff = 2;
cout << totalNumbersWithSpecificDifference(N, diff);
return 0;
}
Java
/* Java program to count total numbers which
have difference with sum of digits greater
than specific value */
class Test
{
// Utility method to get sum of digits of K
static int sumOfDigit(int K)
{
// loop until K is not zero
int sod = 0;
while (K != 0)
{
sod += K % 10;
K /= 10;
}
return sod;
}
// method returns count of numbers smaller than N,
// satisfying difference condition
static int totalNumbersWithSpecificDifference(int N, int diff)
{
int low = 1, high = N;
// binary search while loop
while (low <= high)
{
int mid = (low + high) / 2;
/* if difference between number and its sum
of digit is smaller than given difference
then smallest number will be on left side */
if (mid - sumOfDigit(mid) < diff)
low = mid + 1;
/* if difference between number and its sum
of digit is greater than or equal to given
difference then smallest number will be on
right side */
else
high = mid - 1;
}
// return the difference between 'smallest number
// found' and 'N' as result
return (N - high);
}
// Driver method
public static void main(String args[])
{
int N = 13;
int diff = 2;
System.out.println(totalNumbersWithSpecificDifference(N, diff));
}
}
Python3
# Python program to count total numbers which
# have difference with sum of digits greater
# than specific value
# Utility method to get sum of digits of K
def sumOfDigit(K):
# loop until K is not zero
sod = 0
while (K):
sod =sod + K % 10
K =K // 10
return sod
# method returns count of
# numbers smaller than N,
# satisfying difference condition
def totalNumbersWithSpecificDifference(N,diff):
low = 1
high = N
# binary search while loop
while (low <= high):
mid = (low + high) // 2
''' if difference between number and its sum
of digit is smaller than given difference
then smallest number will be on left side'''
if (mid - sumOfDigit(mid) < diff):
low = mid + 1
# if difference between number and its sum
# of digit greater than equal to given
# difference then smallest number will be on
# right side
else:
high = mid - 1
# return the difference between 'smallest number
# found' and 'N' as result
return (N - high)
# Driver code to test above methods
N = 13
diff = 2
print(totalNumbersWithSpecificDifference(N, diff))
# This code is contributed by Anant Agarwal.
C#
// C# program to count total numbers
// which have difference with sum of
// digits greater than specific value
using System;
class Test {
// Utility method to get sum
// of digits of K
static int sumOfDigit(int K)
{
// loop until K is not zero
int sod = 0;
while (K != 0)
{
sod += K % 10;
K /= 10;
}
return sod;
}
// method returns count of numbers
// smaller than N, satisfying
// difference condition
static int totalNumbersWithSpecificDifference(int N,
int diff)
{
int low = 1, high = N;
// binary search while loop
while (low <= high)
{
int mid = (low + high) / 2;
// if difference between number and
// its sum of digit is smaller than
// given difference then smallest
// number will be on left side
if (mid - sumOfDigit(mid) < diff)
low = mid + 1;
// if difference between number and
// its sum of digit is greater than
// or equal to given difference then
// smallest number will be on right side
else
high = mid - 1;
}
// return the difference between
// 'smallest number found'
// and 'N' as result
return (N - high);
}
// Driver code
public static void Main()
{
int N = 13;
int diff = 2;
Console.Write(totalNumbersWithSpecificDifference(N, diff));
}
}
// This code is contributed by nitin mittal
PHP
输出:
4