本文概述
- C ++
- Java
- Python 3
- C#
例子:
Input: l = 2, r = 10
Output: 5
2, 3, 4, 5 and 7 are such numbersInput: l = 15, r = 22
Output: 3
17, 19 and 22 are such numbers
As, 17 and 19 are already prime.
Prime Factors of 22 = 2 * 11 i.e
For 22, Sum of digits is 2+2 = 4
For 2 * 11, Sum of digits is 2 + 1 + 1 = 4
方法:一个有效的解决方案是修改Eratosthenes筛这样, 对于每个非素数, 它都会存储最小的素因数(前置因子)。
预处理以找到2到MAXN之间所有数字的最小素因数。可以通过在固定时间内将数字分解为其质数因子来完成, 因为对于每个数字, 如果它是质数, 则没有前置因子。
否则, 我们可以将其分解为一个质数因子, 然后将其分解为质数因子的另一部分。
并重复此提取因子的过程, 直到它成为素数。
然后通过添加最小素数的第th个数字来检查该数字的位数是否等于素数的位数。
SPF [n]的Digits_Sum和(n/SPF [n])的Digits_Sum现在创建前缀求和数组, 该数组计算最多有N个数字的有效数字。对于每个查询, 请打印:
ans [R] – ans [L-1]下面是上述方法的实现:
C ++
//C++ program to Find the count of the numbers
//in the given range such that the sum of its
//digit is equal to the sum of all its prime
//factors digits sum.
#include <
bits/stdc++.h>
using namespace std;
//maximum size of number
#define MAXN 100005//array to store smallest prime factor of number
int spf[MAXN] = { 0 };
//array to store sum of digits of a number
int sum_digits[MAXN] = { 0 };
//boolean array to check given number is countable
//for required answer or not.
bool isValid[MAXN] = { 0 };
//prefix array to store answer
int ans[MAXN] = { 0 };
//Calculating SPF (Smallest Prime Factor) for every
//number till MAXN.
void Smallest_prime_factor()
{
//marking smallest prime factor for every
//number to be itself.
for ( int i = 1;
i <
MAXN;
i++)
spf[i] = i;
//separately marking spf for every even
//number as 2
for ( int i = 4;
i <
MAXN;
i += 2)
spf[i] = 2;
for ( int i = 3;
i * i <
= MAXN;
i += 2)//checking if i is prime
if (spf[i] == i)//marking SPF for all numbers divisible by i
for ( int j = i * i;
j <
MAXN;
j += i)//marking spf[j] if it is not
//previously marked
if (spf[j] == j)
spf[j] = i;
}//Function to find sum of digits in a number
int Digit_Sum( int copy)
{
int d = 0;
while (copy) {
d += copy % 10;
copy /= 10;
}return d;
}//find sum of digits of all numbers up to MAXN
void Sum_Of_All_Digits()
{
for ( int n = 2;
n <
MAXN;
n++) {
//add sum of digits of least
//prime factor and n/spf[n]
sum_digits[n] = sum_digits[n /spf[n]]
+ Digit_Sum(spf[n]);
//if it is valid make isValid true
if (Digit_Sum(n) == sum_digits[n])
isValid[n] = true ;
}//prefix sum to compute answer
for ( int n = 2;
n <
MAXN;
n++) {
if (isValid[n])
ans[n] = 1;
ans[n] += ans[n - 1];
}
}//Driver code
int main()
{
Smallest_prime_factor();
Sum_Of_All_Digits();
//decleartion
int l, r;
//print answer for required range
l = 2, r = 3;
cout <
<
"Valid numbers in the range " <
<
l <
<
" "
<
<
r <
<
" are " <
<
ans[r] - ans[l - 1] <
<
endl;
//print answer for required range
l = 2, r = 10;
cout <
<
"Valid numbers in the range " <
<
l <
<
" "
<
<
r <
<
" are " <
<
ans[r] - ans[l - 1] <
<
endl;
return 0;
}
Java
//Java program to Find the count
//of the numbers in the given
//range such that the sum of its
//digit is equal to the sum of
//all its prime factors digits sum.
import java.io.*;
class GFG
{//maximum size of number
static int MAXN = 100005 ;
//array to store smallest
//prime factor of number
static int spf[] = new int [MAXN];
//array to store sum
//of digits of a number
static int sum_digits[] = new int [MAXN];
//boolean array to check
//given number is countable
//for required answer or not.
static boolean isValid[] = new boolean [MAXN];
//prefix array to store answer
static int ans[] = new int [MAXN];
//Calculating SPF (Smallest
//Prime Factor) for every
//number till MAXN.
static void Smallest_prime_factor()
{
//marking smallest prime factor
//for every number to be itself.
for ( int i = 1 ;
i <
MAXN;
i++)
spf[i] = i;
//separately marking spf
//for every even number as 2
for ( int i = 4 ;
i <
MAXN;
i += 2 )
spf[i] = 2 ;
for ( int i = 3 ;
i * i <
= MAXN;
i += 2 )//checking if i is prime
if (spf[i] == i)//marking SPF for all
//numbers divisible by i
for ( int j = i * i;
j <
MAXN;
j += i)//marking spf[j] if it
//is not previously marked
if (spf[j] == j)
spf[j] = i;
}//Function to find sum
//of digits in a number
static int Digit_Sum( int copy)
{
int d = 0 ;
while (copy>
0 )
{
d += copy % 10 ;
copy /= 10 ;
}return d;
}//find sum of digits of
//all numbers up to MAXN
static void Sum_Of_All_Digits()
{
for ( int n = 2 ;
n <
MAXN;
n++)
{
//add sum of digits of least
//prime factor and n/spf[n]
sum_digits[n] = sum_digits[n /spf[n]]
+ Digit_Sum(spf[n]);
//if it is valid make isValid true
if (Digit_Sum(n) == sum_digits[n])
isValid[n] = true ;
}//prefix sum to compute answer
for ( int n = 2 ;
n <
MAXN;
n++)
{
if (isValid[n])
ans[n] = 1 ;
ans[n] += ans[n - 1 ];
}
}//Driver code
public static void main (String[] args)
{
Smallest_prime_factor();
Sum_Of_All_Digits();
//declaration
int l, r;
//print answer for required range
l = 2 ;
r = 3 ;
System.out.println( "Valid numbers in the range " +
l + " " + r + " are " +
(ans[r] - ans[l - 1 ] ));
//print answer for required range
l = 2 ;
r = 10 ;
System.out.println( "Valid numbers in the range " +
l + " " + r + " are " +
(ans[r] - ans[l - 1 ]));
}
}//This code is contributed
//by Inder
Python 3
# Python 3 program to Find the count of
# the numbers in the given range such
# that the sum of its digit is equal to
# the sum of all its prime factors digits sum.# maximum size of number
MAXN = 100005# array to store smallest prime
# factor of number
spf = [ 0 ] * MAXN# array to store sum of digits of a number
sum_digits = [ 0 ] * MAXN# boolean array to check given number
# is countable for required answer or not.
isValid = [ 0 ] * MAXN# prefix array to store answer
ans = [ 0 ] * MAXN# Calculating SPF (Smallest Prime Factor)
# for every number till MAXN.
def Smallest_prime_factor():# marking smallest prime factor
# for every number to be itself.
for i in range ( 1 , MAXN):
spf[i] = i# separately marking spf for
# every even number as 2
for i in range ( 4 , MAXN, 2 ):
spf[i] = 2i = 3
while i * i <
= MAXN: # checking if i is prime
if (spf[i] = = i):# marking SPF for all numbers
# divisible by i
for j in range (i * i, MAXN, i):# marking spf[j] if it is not
# previously marked
if (spf[j] = = j):
spf[j] = ii + = 2# Function to find sum of digits
# in a number
def Digit_Sum(copy):d = 0
while (copy) :
d + = copy % 10
copy //= 10return d# find sum of digits of all
# numbers up to MAXN
def Sum_Of_All_Digits():for n in range ( 2 , MAXN) :# add sum of digits of least
# prime factor and n/spf[n]
sum_digits[n] = (sum_digits[n //spf[n]] +
Digit_Sum(spf[n]))# if it is valid make isValid true
if (Digit_Sum(n) = = sum_digits[n]):
isValid[n] = True# prefix sum to compute answer
for n in range ( 2 , MAXN) :
if (isValid[n]):
ans[n] = 1
ans[n] + = ans[n - 1 ]# Driver code
if __name__ = = "__main__" :Smallest_prime_factor()
Sum_Of_All_Digits()# print answer for required range
l = 2
r = 3
print ( "Valid numbers in the range" , l, r, "are" , ans[r] - ans[l - 1 ])# print answer for required range
l = 2
r = 10
print ( "Valid numbers in the range" , l, r, "are" , ans[r] - ans[l - 1 ])# This code is contributed by ita_c
C#
//C# program to Find the count
//of the numbers in the given
//range such that the sum of its
//digit is equal to the sum of
//all its prime factors digits sum.
using System;
class GFG
{//maximum size of number
static int MAXN = 100005;
//array to store smallest
//prime factor of number
static int []spf = new int [MAXN];
//array to store sum
//of digits of a number
static int []sum_digits = new int [MAXN];
//boolean array to check
//given number is countable
//for required answer or not.
static bool []isValid = new bool [MAXN];
//prefix array to store answer
static int []ans = new int [MAXN];
//Calculating SPF (Smallest
//Prime Factor) for every
//number till MAXN.
static void Smallest_prime_factor()
{
//marking smallest prime factor
//for every number to be itself.
for ( int i = 1;
i <
MAXN;
i++)
spf[i] = i;
//separately marking spf
//for every even number as 2
for ( int i = 4;
i <
MAXN;
i += 2)
spf[i] = 2;
for ( int i = 3;
i * i <
= MAXN;
i += 2)//checking if i is prime
if (spf[i] == i)//marking SPF for all
//numbers divisible by i
for ( int j = i * i;
j <
MAXN;
j += i)//marking spf[j] if it
//is not previously marked
if (spf[j] == j)
spf[j] = i;
}//Function to find sum
//of digits in a number
static int Digit_Sum( int copy)
{
int d = 0;
while (copy>
0)
{
d += copy % 10;
copy /= 10;
}return d;
}//find sum of digits of
//all numbers up to MAXN
static void Sum_Of_All_Digits()
{
for ( int n = 2;
n <
MAXN;
n++)
{
//add sum of digits of least
//prime factor and n/spf[n]
sum_digits[n] = sum_digits[n /spf[n]] +
Digit_Sum(spf[n]);
//if it is valid make
//isValid true
if (Digit_Sum(n) == sum_digits[n])
isValid[n] = true ;
}//prefix sum to compute answer
for ( int n = 2;
n <
MAXN;
n++)
{
if (isValid[n])
ans[n] = 1;
ans[n] += ans[n - 1];
}
}//Driver code
public static void Main ()
{
Smallest_prime_factor();
Sum_Of_All_Digits();
//declaration
int l, r;
//print answer for required range
l = 2;
r = 3;
Console.WriteLine( "Valid numbers in the range " +
l + " " + r + " are " +
(ans[r] - ans[l - 1] ));
//print answer for required range
l = 2;
r = 10;
Console.WriteLine( "Valid numbers in the range " +
l + " " + r + " are " +
(ans[r] - ans[l - 1]));
}
}//This code is contributed
//by Subhadeep
【数字和等于其所有素数的数字之和的数字】输出如下:
Valid numbers in the range 2 3 are 2
Valid numbers in the range 2 10 are 5
推荐阅读
- C++ STL中的array::crbegin()和array::crend()
- Python使用Django进行表单验证项目示例
- Python Django-allauth设置和配置
- [L,R]范围内的数字计数,其中至少包含一个除以K的数字
- 从BST构建二叉树,使其遍历级别顺序可打印排序的数据
- 将二进制字符串拆分为0和1相等数量的子字符串
- win10变回win7图文详细教程图解
- 本图文详细教程教你各版本Ghost windows10系统激活码密钥
- 最新通用版win10激活密钥分享制作详细说明