计算范围内的数字,在C ++中偶数和奇数位置的数字总和为质数

给定两个数字start和end作为范围变量。目的是找到在此范围内[开始,结束]的数字计数,它们的偶数位数之和与奇数位数之和为质数。

即(偶数位置的数字之和)-(奇数位置的数字之和)=质数

让我们通过示例来理解。

例如

输入-开始= 230,结束= 270

输出-范围内的数字计数,偶数和奇数位置的数字总和之间的差作为质数为:6

说明-number(s)满足条件  的介于230到270之间是:

240(4-2是2),250(5-2是3),251(5-3是2),261(6-3是3),262(6-4是2),270(7-2是5)。

所有这些差异是2、3和5,它们是素数。

输入-开始= 1101,结束= 1120

输出-范围内的数字计数,偶数和奇数位置的数字总和之间的差作为质数为:1

说明-在number(s)1120满足条件的1101之间是:

1120(3-1是2)。2是质数。 

以下程序中使用的方法如下

在这种情况下,我们使用动态编程方法并存储具有偶数和奇数位数字之和的素数差的数字的计数。该数组将为arr [size] [90] [90] [2]。这里size是10的幂。因此,作为输入的最大数字将是10 size。 

在每个对函数check的递归调用中(整数位,整数,整数,整数温度,向量<整数> vec),我们将通过从左到右放置数字0到9来构建一个数字。

在arr [size] [x] [y] [temp]中,x表示放置在x处偶数位置的位数之和,y表示放置在y处奇数位数的总和。使用数组arr_2 []来检查所需的差值是否为质数,该数组将按顺序存储最多100个质数。 

  • 将变量start和end作为输入。

  • 取全局数组arr [size] [90] [90] [2]和数组arr_2 []素数最多为100。

  • 功能检查(整数位,整数,整数,整数温度,矢量<整数> vec)将数字的当前位置作为位置,前半位数的当前总和作为偶数和奇数位置数字作为od,temp的值和矢量vec有数字。 

  • 它递归地填充arr [place] [eve] [od] [temp]的值。

  • 以当前元素的初始值为count = 0。

  • 对于当前位置,请使用if(place == )检查位置是否为最后位置。如果是,请检查该位置是奇数还是偶数。vec.size()

  • if(&1)结果为true,则当前位置为奇数,因此将eve替换为od,因为它是奇数长度数字。vec.size()

  • 计算temp_2作为除以od-od的总和之差。

  • 使用for循环,遍历arr_2 []并检查是否找到了temp_2。如果是,则其素数。因此,返回1,否则返回0。

  • 如果已经计算了arr [place] [eve] [od] [temp],则它不会为-1,因此将其返回。

  • 如果temp不为零,则设置temp_3 = 9。Temp_3是我们可以放置的数字的最大限制。如果为0,则放置vec [place],否则数字已经较小,因此放置任何数字,例如9。

  • 从0到temp_3遍历数字。如果当前位置是奇数,则更新set_odd = set_odd + i; (前一个奇数位总和+当前数字i)。

  • 如果当前位置是偶数,则更新set_even = set_even + i; (先前的偶数位置总和+当前数字i)。

  • 设置计数+ =检查(位置+ 1,set_even,set_odd,set_temp,vec); 并返回arr [place] [eve] [od] [temp] = count。

  • 函数place_prime(int val)采用数字val并生成向量vec,该向量包含其从LSB到MSB的数字。

  • 将整个数组arr [] [] [] []设置为-1。

  • 取count = check(0,0,0,0,vec),将在最后返回结果。

  • 返回计数结果。 

示例

#include <bits/stdc++.h>
using namespace std;
const int size = 18;
int arr[size][90][90][2];
//烧掉100个质数
int arr_2[] = {
   2,
   3,
   5,
   7,
   11,
   13,
   17,
   19,
   23,
   29,
   31,
   37,
   43,
   47,
   53,
   59,
   61,
   67,
   71,
   73,
   79,
   83,
   89,
   97
};

int check(int place, int eve, int od, int temp, vector < int > vec) {
   int count;
   int temp_3;
   if (place == vec.size()) {
      if (vec.size() & 1) {
         swap(od, eve);
      }
      int temp_2 = eve - od;
      for (int i = 0; i < 24; i++) {
         if (temp_2 == arr_2[i]) {
            return 1;
         }
      }
      return 0;
   }
   if (arr[place][eve][od][temp] != -1) {
      int set = arr[place][eve][od][temp];
      return set;
   }
   if (temp) {
      temp_3 = 9;
   } else {
      temp_3 = vec[place];
   }
   for (int i = 0; i <= temp_3; i++) {
      int set_temp = temp;
      int set_even = eve;
      int set_odd = od;
      if (i < vec[place]) {
         set_temp = 1;
      }
      if (place & 1) {
         set_odd = set_odd + i;
      } else {
         set_even = set_even + i;
      }
      count += check(place + 1, set_even, set_odd, set_temp, vec);
   }
   return arr[place][eve][od][temp] = count;
}

int place_prime(int val) {
   vector < int > vec;

   while (val) {
      vec.push_back(val % 10);
      val = val / 10;
   }
   reverse(vec.begin(), vec.end());
   memset(arr, -1, sizeof(arr));
   int count = check(0, 0, 0, 0, vec);
   return count;
}
int main() {
   int start = 20, end = 80;
   int count = place_prime(end) - place_prime(start - 1);
   cout << "范围内的数字计数,偶数和奇数位置的数字总和之间的差为素数是: " << count;
   return 0;
}

如果我们运行上面的代码,它将生成以下输出-

输出结果

范围内的数字计数,偶数和奇数位置的数字总和之间的差为素数是: 15

猜你喜欢