给定范围[L,R] ,任务是从该范围中找到所有数字,这些数字都是合成的,并且最终它们的数字之和为1 。
例子:
Input: L = 10, R = 100
Output: 10 28 46 55 64 82 91 100
10 = 1 + 0 = 1
28 = 2 + 8 = 10 = 1 + 0 = 1
…
91 = 9 + 1 = 10 = 1 + 0 = 1
100 = 1 + 0 + 0 = 1
Input: L = 250, R = 350
Output: 253 262 280 289 298 316 325 334 343
方法:对于范围内的每个数字,检查该数字是否为合成数字,即它的除数和数字本身是否为1。如果当前数字是一个复合数字,则继续计算其数字的总和,直到该数字减少为一个数字为止;如果该数字为1,则所选数字为有效数字。
下面是上述方法的实现:
C++
// C++ implementation of the above approach
#include
using namespace std;
// Function that returns true if number n
// is a composite number
bool isComposite(int n)
{
// Corner cases
if (n <= 1)
return false;
if (n <= 3)
return false;
// This is checked so that we can skip
// middle five numbers in below loop
if (n % 2 == 0 || n % 3 == 0)
return true;
for (int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return true;
return false;
}
// Function that returns true if the eventual
// digit sum of number nm is 1
bool isDigitSumOne(int nm)
{
// Loop till the sum is not single digit number
while (nm > 9) {
// Intitialize the sum as zero
int sum_digit = 0;
// Find the sum of digits
while (nm > 0) {
int digit = nm % 10;
sum_digit = sum_digit + digit;
nm = nm / 10;
}
nm = sum_digit;
}
// If sum is eventually 1
if (nm == 1)
return true;
else
return false;
}
// Function to print the required numbers
// from the given range
void printValidNums(int l, int r)
{
for (int i = l; i <= r; i++) {
// If i is one of the required numbers
if (isComposite(i) && isDigitSumOne(i))
cout << i << " ";
}
}
// Driver code
int main(void)
{
int l = 10, r = 100;
printValidNums(l, r);
return 0;
}
Java
// Java implementation of the above approach
public class GFG {
// Function that returns true if number n
// is a composite number
static boolean isComposite(int n)
{
// Corner cases
if (n <= 1)
return false;
if (n <= 3)
return false;
// This is checked so that we can skip
// middle five numbers in below loop
if (n % 2 == 0 || n % 3 == 0)
return true;
for (int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return true;
return false;
}
// Function that returns true if the eventual
// digit sum of number nm is 1
static boolean isDigitSumOne(int nm)
{
// Loop till the sum is not single
// digit number
while (nm > 9) {
// Intitialize the sum as zero
int sum_digit = 0;
// Find the sum of digits
while (nm > 0) {
int digit = nm % 10;
sum_digit = sum_digit + digit;
nm = nm / 10;
}
nm = sum_digit;
}
// If sum is eventually 1
if (nm == 1)
return true;
else
return false;
}
// Function to print the required numbers
// from the given range
static void printValidNums(int l, int r)
{
for (int i = l; i <= r; i++) {
// If i is one of the required numbers
if (isComposite(i) && isDigitSumOne(i))
System.out.print(i + " ");
}
}
// Driver code
public static void main(String arg[])
{
int l = 10, r = 100;
printValidNums(l, r);
}
}
Python3
# Python3 implementation of the approach
# Function that returns true if number n
# is a composite number
def isComposite(n):
# Corner cases
if (n <= 1):
return False
if (n <= 3):
return False
# This is checked so that we can skip
# middle five numbers in below loop
if (n % 2 == 0 or n % 3 == 0):
return True
i = 5
while(i * i <= n):
if (n % i == 0 or n % (i + 2) == 0):
return True
i = i + 6
return False
# Function that returns true if the eventual
# digit sum of number nm is 1
def isDigitSumOne(nm) :
# Loop till the sum is not single
# digit number
while(nm>9) :
# Intitialize the sum as zero
sum_digit = 0
# Find the sum of digits
while(nm != 0) :
digit = nm % 10
sum_digit = sum_digit + digit
nm = nm // 10
nm = sum_digit
# If sum is eventually 1
if(nm == 1):
return True
else:
return False
# Function to print the required numbers
# from the given range
def printValidNums(m, n ):
for i in range(m, n + 1):
# If i is one of the required numbers
if(isComposite(i) and isDigitSumOne(i)) :
print(i, end =" ")
# Driver code
l = 10
r = 100
printValidNums(m, n)
C#
// C# implementation of the above approach
using System;
class GFG
{
// Function that returns true if number n
// is a composite number
static bool isComposite(int n)
{
// Corner cases
if (n <= 1)
return false;
if (n <= 3)
return false;
// This is checked so that we can skip
// middle five numbers in below loop
if (n % 2 == 0 || n % 3 == 0)
return true;
for (int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return true;
return false;
}
// Function that returns true if the
// eventual digit sum of number nm is 1
static bool isDigitSumOne(int nm)
{
// Loop till the sum is not single
// digit number
while (nm > 9)
{
// Intitialize the sum as zero
int sum_digit = 0;
// Find the sum of digits
while (nm > 0)
{
int digit = nm % 10;
sum_digit = sum_digit + digit;
nm = nm / 10;
}
nm = sum_digit;
}
// If sum is eventually 1
if (nm == 1)
return true;
else
return false;
}
// Function to print the required numbers
// from the given range
static void printValidNums(int l, int r)
{
for (int i = l; i <= r; i++)
{
// If i is one of the required numbers
if (isComposite(i) && isDigitSumOne(i))
Console.Write(i + " ");
}
}
// Driver code
static public void Main ()
{
int l = 10, r = 100;
printValidNums(l, r);
}
}
// This code is contributed by jit_t
PHP
9)
{
// Intitialize the sum as zero
$sum_digit = 0;
// Find the sum of digits
while ($nm > 0)
{
$digit = $nm % 10;
$sum_digit = $sum_digit + $digit;
$nm = floor($nm / 10);
}
$nm = $sum_digit;
}
// If sum is eventually 1
if ($nm == 1)
return true;
else
return false;
}
// Function to print the required numbers
// from the given range
function printValidNums($l, $r)
{
for ($i = $l; $i <= $r; $i++)
{
// If i is one of the required numbers
if (isComposite($i) && isDigitSumOne($i))
echo $i, " ";
}
}
// Driver code
$l = 10; $r = 100;
printValidNums($l, $r);
// This code is contributed by Ryuga
?>
Javascript
输出:
10 28 46 55 64 82 91 100
优化:我们可以使用Sieve算法预先计算复合数字。