给定两个正整数N和M,任务是找到可被N整除且数字总和为M的最小正整数。如果int范围内不存在这样的整数,则打印-1 。
例子:
Input: N = 13, M = 32
Output: 8879
8879 is divisible by 13 and its
Sum of digits of 8879 is 8+8+7+9 = 32
i.e. equals to M
Input: N = 8, M = 32;
Output: 8888
方法:从N开始,遍历n的所有倍数,然后检查其数字总和是否等于m。此问题可以通过log n (INT_MAX)* log 10 (INT_MAX)时间解决。通过以至少m / 9位数的数字开始迭代,可以提高此方法的效率。
下面是该方法的实现:
C++
// C++ implementation of the above approach
#include
using namespace std;
// Function to return digit sum
int digitSum(int n)
{
int ans = 0;
while (n) {
ans += n % 10;
n /= 10;
}
return ans;
}
// Function to find out the smallest integer
int findInt(int n, int m)
{
int minDigit = floor(m / 9);
// Start of the iterator (Smallest multiple of n)
int start = pow(10, minDigit) -
(int)pow(10, minDigit) % n;
while (start < INT_MAX) {
if (digitSum(start) == m)
return start;
else
start += n;
}
return -1;
}
// Driver code
int main()
{
int n = 13, m = 32;
cout << findInt(n, m);
return 0;
}
Java
// Java implementation of the above approach
class GFG
{
// Function to return digit sum
static int digitSum(int n)
{
int ans = 0;
while (n != 0)
{
ans += n % 10;
n /= 10;
}
return ans;
}
// Function to find out the
// smallest integer
static int findInt(int n, int m)
{
int minDigit = (int)Math.floor((double)(m / 9));
// Start of the iterator (Smallest multiple of n)
int start = (int)Math.pow(10, minDigit) -
(int)Math.pow(10, minDigit) % n;
while (start < Integer.MAX_VALUE)
{
if (digitSum(start) == m)
return start;
else
start += n;
}
return -1;
}
// Driver code
static public void main(String args[])
{
int n = 13, m = 32;
System.out.print(findInt(n, m));
}
}
// This code is contributed
// by Akanksha Rai
Python3
# Python 3 implementation of the
# above approach
from math import floor, pow
import sys
# Function to return digit sum
def digitSum(n):
ans = 0;
while (n):
ans += n % 10;
n = int(n / 10);
return ans
# Function to find out the smallest
# integer
def findInt(n, m):
minDigit = floor(m / 9)
# Start of the iterator (Smallest
# multiple of n)
start = (int(pow(10, minDigit)) -
int(pow(10, minDigit)) % n)
while (start < sys.maxsize):
if (digitSum(start) == m):
return start
else:
start += n
return -1
# Driver code
if __name__ == '__main__':
n = 13
m = 32
print(findInt(n, m))
# This code is cotributed by
# Surendra_Gangwar
C#
// C# implementation of the above approach
using System;
class GFG
{
// Function to return digit sum
static int digitSum(int n)
{
int ans = 0;
while (n != 0)
{
ans += n % 10;
n /= 10;
}
return ans;
}
// Function to find out the
// smallest integer
static int findInt(int n, int m)
{
int minDigit = (int)Math.Floor((double)(m / 9));
// Start of the iterator (Smallest multiple of n)
int start = (int)Math.Pow(10, minDigit) -
(int)Math.Pow(10, minDigit) % n;
while (start < int.MaxValue)
{
if (digitSum(start) == m)
return start;
else
start += n;
}
return -1;
}
// Driver code
static public void Main()
{
int n = 13, m = 32;
Console.WriteLine(findInt(n, m));
}
}
// This code is contributed by Ryuga
PHP
输出:
8879