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

更新于:2020年9月9日

130 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告