给定数字N。给定两个数字X和Y ,任务是找到可以被X或Y整除的所有从1到N的数字之和。
例子:
Input : N = 20
Output : 98
Input : N = 14
Output : 45
方法:要解决此问题,请执行以下步骤:
->查找可被X整除到N的数字之和。用S1表示。
->查找可被Y整除到N的数字之和。用S2表示。
->查找可被X和Y(X * Y)整除到N的数字总和。用S3表示。
->最终答案将是S1 + S2 – S3 。
为了找到总和,我们可以使用AP的一般公式:
Sn = (n/2) * {2*a + (n-1)*d}
对于S1 :X可以除以N的总数为N / X,总和为:
Hence,
S1 = ((N/X)/2) * (2 * X + (N/X - 1) * X)
对于S2 :可被Y整除到N的总数为N / Y,总和为:
Hence,
S2 = ((N/Y)/2) * (2 * Y + (N/Y - 1) * Y)
对于S3 :可被X和Y整除到N的总数为N /(X * Y),总和为:
Hence,
S2 = ((N/(X*Y))/2) * (2 * Y + (N/(X*Y) - 1) * (X*Y))
因此,结果将是:
S = S1 + S2 - S3
下面是上述方法的实现:
C++
// C++ program to find sum of numbers from
// 1 to N which are divisible by X or Y
#include
using namespace std;
// Function to calculate the sum
// of numbers divisible by X or Y
int sum(int N, int X, int Y)
{
int S1, S2, S3;
S1 = ((N / X)) * (2 * X + (N / X - 1) * X) / 2;
S2 = ((N / Y)) * (2 * Y + (N / Y - 1) * Y) / 2;
S3 = ((N / (X * Y))) * (2 * (X * Y)
+ (N / (X * Y) - 1) * (X * Y))/ 2;
return S1 + S2 - S3;
}
// Driver code
int main()
{
int N = 14;
int X = 3, Y = 5;
cout << sum(N, X, Y);
return 0;
}
Java
// Java program to find sum of numbers from
// 1 to N which are divisible by X or Y
public class GFG{
// Function to calculate the sum
// of numbers divisible by X or Y
static int sum(int N, int X, int Y)
{
int S1, S2, S3;
S1 = ((N / X)) * (2 * X + (N / X - 1) * X) / 2;
S2 = ((N / Y)) * (2 * Y + (N / Y - 1) * Y) / 2;
S3 = ((N / (X * Y))) * (2 * (X * Y)
+ (N / (X * Y) - 1) * (X * Y))/ 2;
return S1 + S2 - S3;
}
// Driver code
public static void main(String []args)
{
int N = 14;
int X = 3, Y = 5;
System.out.println(sum(N, X, Y));
}
// This code is contributed by Ryuga
}
Python3
# Python 3 program to find sum of numbers from
# 1 to N which are divisible by X or Y
from math import ceil, floor
# Function to calculate the sum
# of numbers divisible by X or Y
def sum(N, X, Y):
S1 = floor(floor(N / X) * floor(2 * X +
floor(N / X - 1) * X) / 2)
S2 = floor(floor(N / Y)) * floor(2 * Y +
floor(N / Y - 1) * Y) / 2
S3 = floor(floor(N / (X * Y))) * floor (2 * (X * Y) +
floor(N / (X * Y) - 1) * (X * Y))/ 2
return S1 + S2 - S3
# Driver code
if __name__ == '__main__':
N = 14
X = 3
Y = 5
print(int(sum(N, X, Y)))
# This code is contributed by
# Surendra_Gangwar
C#
// C# program to find sum of numbers from
// 1 to N which are divisible by X or Y
using System;
public class GFG{
// Function to calculate the sum
// of numbers divisible by X or Y
static int sum(int N, int X, int Y)
{
int S1, S2, S3;
S1 = ((N / X)) * (2 * X + (N / X - 1) * X) / 2;
S2 = ((N / Y)) * (2 * Y + (N / Y - 1) * Y) / 2;
S3 = ((N / (X * Y))) * (2 * (X * Y)
+ (N / (X * Y) - 1) * (X * Y))/ 2;
return S1 + S2 - S3;
}
// Driver code
public static void Main()
{
int N = 14;
int X = 3, Y = 5;
Console.Write(sum(N, X, Y));
}
}
PHP
Javascript
输出:
45
时间复杂度: O(1)