鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 欧拉计划

题目43:找出所有具有异常子串整除性的pandigital数之和

[复制链接]
发表于 2021-2-19 21:17:49 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2021-2-19 22:18 编辑

手动 Permutation
C++ 3ms
  1. #include<iostream>
  2. #include<array>



  3. int main() {
  4.     using namespace std;
  5.     ios::sync_with_stdio(false);

  6.     array<bool, 10>free;
  7.     array<unsigned char, 10>d;
  8.     free.fill(true);


  9.     for (d[0] = 1; d[0] ^ 10; d[0]++) {
  10.         free[d[0]] = false;

  11.         for (d[1] = 0; d[1] ^ 10; d[1]++) {
  12.             if (free[d[1]]) {
  13.                 free[d[1]] = false;

  14.                 for (d[2] = 0; d[2] ^ 10; d[2]++) {
  15.                     if (free[d[2]]) {
  16.                         free[d[2]] = false;

  17.                         for (d[3] = 0; d[3] ^ 10; d[3] += 2) {
  18.                             if (free[d[3]]) {
  19.                                 free[d[3]] = false;

  20.                                 for (d[4] = 3 - (d[2] + d[3]) % 3; d[4] < 10; d[4] += 3) {
  21.                                     if (free[d[4]]) {
  22.                                         free[d[4]] = false;

  23.                                         for (d[5] = 0; d[5] ^ 10; d[5] += 5) {
  24.                                             if (free[d[5]]) {
  25.                                                 free[d[5]] = false;

  26.                                                 for (d[6] = 0; d[6] ^ 10; d[6]++) {
  27.                                                     if (free[d[6]] && !((d[4] * 100 + d[5] * 10 + d[6]) % 7)) {
  28.                                                         free[d[6]] = false;

  29.                                                         for (d[7] = 0; d[7] ^ 10; d[7]++) {
  30.                                                             if (free[d[7]] && !((d[5] * 100 + d[6] * 10 + d[7]) % 11)) {
  31.                                                                 free[d[7]] = false;

  32.                                                                 for (d[8] = 0; d[8] ^ 10; d[8]++) {
  33.                                                                     if (free[d[8]] && !((d[6] * 100 + d[7] * 10 + d[8]) % 13)) {
  34.                                                                         free[d[8]] = false;

  35.                                                                         for (d[9] = 0; d[9] < 10; d[9]++) {
  36.                                                                             if (free[d[9]] && !((d[7] * 100 + d[8] * 10 + d[9]) % 17)) {
  37.                                                                                 for (auto i : d) {
  38.                                                                                     cout.put('0' + i);
  39.                                                                                 }
  40.                                                                                 cout << '\n';
  41.                                                                             }
  42.                                                                         }

  43.                                                                         free[d[8]] = true;
  44.                                                                     }
  45.                                                                 }

  46.                                                                 free[d[7]] = true;
  47.                                                             }
  48.                                                         }

  49.                                                         free[d[6]] = true;
  50.                                                     }
  51.                                                 }

  52.                                                 free[d[5]] = true;
  53.                                             }
  54.                                         }

  55.                                         free[d[4]] = true;
  56.                                     }
  57.                                 }

  58.                                 free[d[3]] = true;
  59.                             }
  60.                         }

  61.                         free[d[2]] = true;
  62.                     }
  63.                 }

  64.                 free[d[1]] = true;
  65.             }
  66.         }

  67.         free[d[0]] = true;
  68.     }
  69. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 12:46:36 | 显示全部楼层
渡风 发表于 2017-6-13 00:14
此代码使用matlab编程
Problem43所用时间为491.9989秒
Problem43的答案为16695334890

matlab跟python很像啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 15:30:02 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. main()
  4. {
  5.         long long int i, sum = 0;
  6.         int j, k, flag = 1, array[7] = { 2, 3, 5, 7, 11, 13, 17 }, temp[10] = { 0 };
  7.         char str[20], num[10];
  8.         for (int a = 1; a < 10; a++)
  9.         {
  10.                 temp[a] = 1;
  11.                 str[0] = a + '0';
  12.                 for (int b = 0; b < 10; b++)
  13.                 {
  14.                         if (temp[b])
  15.                         {
  16.                                 continue;
  17.                         }
  18.                         temp[b] = 1;
  19.                         str[1] = b + '0';
  20.                         for (int c = 0; c < 10; c++)
  21.                         {
  22.                                 if (temp[c])
  23.                                 {
  24.                                         continue;
  25.                                 }
  26.                                 temp[c] = 1;
  27.                                 str[2] = c + '0';
  28.                                 for (int d = 0; d < 10; d++)
  29.                                 {
  30.                                         if (temp[d])
  31.                                         {
  32.                                                 continue;
  33.                                         }
  34.                                         temp[d] = 1;
  35.                                         str[3] = d + '0';
  36.                                         for (int e = 0; e < 10; e++)
  37.                                         {
  38.                                                 if (temp[e])
  39.                                                 {
  40.                                                         continue;
  41.                                                 }
  42.                                                 temp[e] = 1;
  43.                                                 str[4] = e + '0';
  44.                                                 for (int f = 0; f < 10; f++)
  45.                                                 {
  46.                                                         if (temp[f])
  47.                                                         {
  48.                                                                 continue;
  49.                                                         }
  50.                                                         temp[f] = 1;
  51.                                                         str[5] = f + '0';
  52.                                                         for (int g = 0; g < 10; g++)
  53.                                                         {
  54.                                                                 if (temp[g])
  55.                                                                 {
  56.                                                                         continue;
  57.                                                                 }
  58.                                                                 temp[g] = 1;
  59.                                                                 str[6] = g + '0';
  60.                                                                 for (int h = 0; h < 10; h++)
  61.                                                                 {
  62.                                                                         if (temp[h])
  63.                                                                         {
  64.                                                                                 continue;
  65.                                                                         }
  66.                                                                         temp[h] = 1;
  67.                                                                         str[7] = h + '0';
  68.                                                                         for (int m = 0; m < 10; m++)
  69.                                                                         {
  70.                                                                                 if (temp[m])
  71.                                                                                 {
  72.                                                                                         continue;
  73.                                                                                 }
  74.                                                                                 temp[m] = 1;
  75.                                                                                 str[8] = m + '0';
  76.                                                                                 for (int n = 0; n < 10; n++)
  77.                                                                                 {

  78.                                                                                         if (temp[n])
  79.                                                                                         {
  80.                                                                                                 continue;
  81.                                                                                         }
  82.                                                                                         temp[n] = 1;
  83.                                                                                         str[9] = n + '0';
  84.                                                                                         str[10] = '\0';
  85.                                                                                         for (j = 0; j < 7; j++)
  86.                                                                                         {
  87.                                                                                                 num[0] = str[j + 1];
  88.                                                                                                 num[1] = str[j + 2];
  89.                                                                                                 num[2] = str[j + 3];
  90.                                                                                                 num[3] = '\0';

  91.                                                                                                 k = atoi(num);
  92.                                                                                                 if (k % array[j])
  93.                                                                                                 {
  94.                                                                                                         flag = 0;
  95.                                                                                                         break;
  96.                                                                                                 }
  97.                                                                                         }

  98.                                                                                         if (flag)
  99.                                                                                         {
  100.                                                                                                 i = atof(str);
  101.                                                                                                 sum += i;
  102.                                                                                                 printf("%lld\n", i);
  103.                                                                                         }
  104.                                                                                         flag = 1;
  105.                                                                                         temp[n] = 0;
  106.                                                                                        
  107.                                                                                 }
  108.                                                                                 temp[m] = 0;
  109.                                                                         }
  110.                                                                         temp[h] = 0;
  111.                                                                 }
  112.                                                                 temp[g] = 0;
  113.                                                         }
  114.                                                         temp[f] = 0;
  115.                                                 }
  116.                                                 temp[e] = 0;
  117.                                         }
  118.                                         temp[d] = 0;
  119.                                 }
  120.                                 temp[c] = 0;
  121.                         }
  122.                         temp[b] = 0;
  123.                 }
  124.                 temp[a] = 0;
  125.                
  126.         }
  127.         printf("\n%lld\n", sum);

  128. }
复制代码


1406357289
1430952867
1460357289
4106357289
4130952867
4160357289

sum = 16695334890
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-7 21:44:34 | 显示全部楼层
这个问题我们用OpenMP的平行编程来处理
  1. /*
  2. 答案:16695334890
  3. 耗时:0.276207秒(单核)
  4.       0.0415891(八核)
  5. */
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <cstring>
  9. #include <omp.h>
  10. using namespace std;

  11. const int d[] = { 2,3,5,7,11,13,17 };
  12. //线程里面不能处理的内容太少,否则反而把更多的时间花在线程切换和等待上
  13. const int nSteps = 256;//线程每次处理的数的个数

  14. int main(void)
  15. {
  16.   char str[12] = "0123456789";
  17.   long long nSum = 0;
  18.   volatile bool bContinue = true;
  19. #pragma omp parallel shared(bContinue,str) reduction(+:nSum)
  20.   while (bContinue)
  21.   {
  22.     char str1[12], str2[4];
  23.     int nK = 0;
  24. #pragma omp critical
  25.     {
  26.       //获得当前要处理的数据
  27.       strcpy_s(str1, str);
  28.       for (nK = 0; bContinue && nK < nSteps; ++nK)
  29.         bContinue = next_permutation(str, str + 10);//处理出给其他线程用的值
  30.     }
  31.     for (int j = 0; j < nK; ++j)
  32.     {
  33.       bool bFlag = true;
  34.       for (int i = 0; i < 7; ++i)
  35.       {
  36.         strncpy_s(str2, str1 + (i + 1), 3);
  37.         str2[3] = 0;
  38.         int a = atoi(str2);
  39.         if (a % d[i] != 0)
  40.         {
  41.           bFlag = false;
  42.           break;
  43.         }
  44.       }
  45.       if (bFlag)
  46.       {
  47.         long long k = 0;
  48.         for (int i = 0; i < 10; ++i)
  49.         {
  50.           k *= 10;
  51.           k += int(str1[i] - 48);
  52.         }
  53.         nSum += k;
  54.       }
  55.       next_permutation(str1, str1 + 10);
  56.     }
  57.   }
  58.   cout << nSum << endl;
  59.   return 0;
  60. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-24 20:37:52 | 显示全部楼层
  1. import time as t
  2. from itertools import permutations

  3. start = t.perf_counter()


  4. def have_traits(a_tuple):
  5.     list_dn = []
  6.     divisors = [2, 3, 5, 7, 11, 13, 17]
  7.     for n in range(1, 8):
  8.         list_dn.append(int(a_tuple[n] + a_tuple[n + 1] + a_tuple[n + 2]))
  9.     for index in range(7):
  10.         if not (list_dn[index] // divisors[index] == list_dn[index] / divisors[index]):
  11.             return False
  12.     else:
  13.         return True


  14. num_list = list(permutations('0123456789'))
  15. nums = []
  16. for num_tuple in num_list:
  17.     if len(num_tuple) == 10 and have_traits(num_tuple):
  18.         num_str = ''
  19.         for i in range(10):
  20.             num_str += num_tuple[i]
  21.         nums.append(int(num_str))

  22. print(nums)
  23. print(sum(nums))
  24. print("It costs %f s" % (t.perf_counter() - start))
复制代码



[1406357289, 1430952867, 1460357289, 4106357289, 4130952867, 4160357289]
16695334890
It costs 10.803681 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 19:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表