C++中关于一个数的所有因子的奇数位数和的查询
在这个程序中,我们给定Q个查询,每个查询都有一个正整数N。我们的任务是创建一个C++程序来解决关于一个数的所有因子的奇数位数和的查询。
问题描述 − 为了解决每个查询,我们需要找到数字N的所有因子。然后将所有位数和为奇数的因子相加。并返回每个查询的最终和。
让我们来看一个例子来理解这个问题:
输入
Q = 2, queries = {15, 8}
输出
8 1
解释
对于查询1:N = 15,15的因子是1, 3, 5, 15。
因子中奇数位的和是 1 + 3 + 5 = 8
对于查询2:N = 8,8的因子是1, 2, 4, 8。
因子中奇数位的和是 1 = 1
解决方案
为了解决这个问题,我们需要对所有数字的奇数位进行求和。从中我们将计算因子,然后将它们相加得到结果。为了使这个求位数和的过程更高效,我们可以使用预计算值。例如,数字41的和可以计算为4的奇数位和加上3的奇数位和。
创建oddDigitSum数组后,我们将找到所有可以整除给定数字的数字。然后,我们将使用oddDigitSum数组添加所有奇数位。
程序说明了我们解决方案的工作原理:
示例
#include <iostream> using namespace std; #define N 99999 void calcOddDigitSum(int oddDigitSum[]) { for (int i = 1; i < N; i++) oddDigitSum[i] = oddDigitSum[i / 10] + (i & 1) * (i % 10); } void findFactorSum(int oddDigitSum[], int factorSum[]) { for (int i = 1; i < N; i++) for (int j = i; j < N; j += i) factorSum[j] += oddDigitSum[i]; } int main(){ int Q = 3; int query[] = { 5, 154, 98 }; int oddDigitSum[N]; int factorSum[N]; calcOddDigitSum(oddDigitSum); findFactorSum(oddDigitSum, factorSum); for (int i = 0; i < Q; i++) cout<<"For query "<<(i+1)<<": The sum of odd number digit sums of all the factors of a number is "<<factorSum[query[i]]<<endl; return 0; }
输出
For query 1: The sum of odd number digit sums of all the factors of a number is 6 For query 2: The sum of odd number digit sums of all the factors of a number is 31 For query 3: The sum of odd number digit sums of all the factors of a number is 27
广告