Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将输出验证为";找出1到1000之间的数字,其素数因子';总和本身就是素数;来自Allain';s跳进C++;(第7章第3节)_C++_Algorithm_Testing_Automation_Oeis - Fatal编程技术网

C++ 将输出验证为";找出1到1000之间的数字,其素数因子';总和本身就是素数;来自Allain';s跳进C++;(第7章第3节)

C++ 将输出验证为";找出1到1000之间的数字,其素数因子';总和本身就是素数;来自Allain';s跳进C++;(第7章第3节),c++,algorithm,testing,automation,oeis,C++,Algorithm,Testing,Automation,Oeis,问题是: 设计一个程序,查找1到1000之间的所有数字,当它们的素数加起来时 加在一起,求和为一个素数(例如,12的素数因子为2、2和3 求和为7,即素数)。实现该算法的代码。 我修改了这个问题,只求唯一因子的和,因为我不明白为什么要像他的例子中使用12那样,计算一个因子两次 。有什么好的(读:自动)方法来验证我的程序的输出吗 1到1000的样本输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 19 20 22 23 24 25 26 28 29 30 31

问题是:

设计一个程序,查找1到1000之间的所有数字,当它们的素数加起来时 加在一起,求和为一个素数(例如,12的素数因子为2、2和3 求和为7,即素数)。实现该算法的代码。 我修改了这个问题,只求唯一因子的和,因为我不明白为什么要像他的例子中使用12那样,计算一个因子两次

。有什么好的(读:自动)方法来验证我的程序的输出吗

1到1000的样本输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
17
19
20
22
23
24
25
26
28
29
30
31
34
37
40
41
43
44
46
47
48
49
52
53
58
59
60
61
63
67
68
70
71
73
76
79
80
82
83
88
89
92
94
96
97
99
101
103
107
109
113
116
117
118
120
121
124
127
131
136
137
139
140
142
147
148
149
151
153
157
160
163
164
167
169
171
172
173
176
179
181
184
188
189
191
192
193
197
198
199
202
207
210
211
212
214
223
227
229
232
233
239
240
241
244
251
252
257
261
263
268
269
271
272
273
274
275
277
279
280
281
283
286
289
292
293
294
297
298
306
307
311
313
317
320
325
331
332
333
334
337
347
349
351
352
353
358
359
361
367
368
369
373
376
379
382
383
384
388
389
394
396
397
399
401
404
409
412
414
419
421
423
424
425
428
431
433
439
443
449
454
457
459
461
462
463
464
467
468
472
475
478
479
480
487
491
495
499
503
509
513
521
522
523
524
529
531
538
539
541
544
546
547
548
549
550
557
560
561
562
563
567
569
571
572
575
577
587
588
593
594
599
601
603
604
605
607
612
613
617
619
621
622
628
631
639
640
641
643
646
647
651
652
653
659
661
664
668
673
677
683
684
691
692
694
701
704
709
712
714
718
719
725
726
727
733
736
738
739
741
743
751
752
756
757
759
761
764
765
768
769
772
773
775
777
783
787
792
797
798
801
809
811
821
823
825
827
828
829
833
837
838
839
841
846
847
848
850
853
856
857
859
862
863
873
877
881
883
887
891
892
903
904
907
908
909
911
918
919
922
925
928
929
932
937
941
944
947
953
954
957
960
961
966
967
971
975
977
981
983
991
997
999
更新:我已经解决了我的问题,并使用@MVW建议的方法验证了我的程序的输出(如所给出的源代码所示)。将来,我将通过执行以下零项或多项(取决于问题的范围/重要性)来测试我的程序:

  • 用谷歌关键词搜索问题的现有解决方案,如果我找到了,将其与我的解决方案进行比较
  • 单元测试组件在构建和集成时的正确性,将这些测试与已知的正确输出进行比较
    • 一些建议:

      您需要检查计算数字的属性。 这意味着

    • 计算素因子和
    • 计算它们的总和和
    • 测试该和是否为素数
    • 顺便说一下,这是你的程序首先应该做的

      因此,一个很好的检查选项是将您的输出与已知的解决方案或另一个已知有效的程序的输出进行比较。棘手的一点是有这样一个解决方案或程序可用。我也忽略了你的比较也会被错误所困扰:-)

      如果您只是将其与其他实现进行比较,例如,这里的其他人提供的程序,那么结果更多的是投票,而不是证明。如果几个独立的实现得到相同的结果,那么您的程序正确的概率就会增加。当然,所有实现都可能出错:-) 越一致越好。 而且实现越多样化越好。 例如,你可以使用不同的编程语言、代数系统,或是有时间、纸、笔和……的朋友。:-)

      另一种方法是在中间步骤中添加检查,以增强对结果的信心。建立信任链

      • 您可以输出您确定的主要因素,并将其与输出进行比较 一个素数因式分解程序的一个例子

      • 然后检查求和是否有效

      • 最后,您可以通过输入已知素数和非素数等来检查应用于候选和的素性测试是否正常工作

      例如,这就是人们对单元测试所做的事情。试图覆盖代码的大部分部分,希望如果部分工作正常,整个工作正常

      或者你可以一步一步地,例如使用另一种形式化的方法。 但这很棘手,最终可能会将程序错误转换为证明中的错误

      今天,在互联网时代,当然,你可以通过互联网搜索解决方案

      试试看,它会给你一个系列。:-)
      这是多重性的问题,但它向你展示了数论专家们做什么,用Mathematica和程序片段来计算数列、数据和文献。非常令人印象深刻。

      以下是我得到的答案。我排除1,因为它没有素数因子,所以它们的和是0,不是素数

      Haskell> filter (isPrime . sum . map fst . primePowers) [2..1000]
      [2,3,4,5,6,7,8,9,10,11,12,13,16,17,18,19,20,22,23,24,25,27,29,31,32,34,36,37,40,
      41,43,44,47,48,49,50,53,54,58,59,61,64,67,68,71,72,73,79,80,81,82,83,88,89,96,97
      ,100,101,103,107,108,109,113,116,118,121,125,127,128,131,136,137,139,142,144,149
      ,151,157,160,162,163,164,165,167,169,173,176,179,181,191,192,193,197,199,200,202
      ,210,211,214,216,223,227,229,232,233,236,239,241,242,243,250,251,256,257,263,269
      ,271,272,273,274,277,281,283,284,288,289,293,298,307,311,313,317,320,324,328,331
      ,337,343,345,347,349,352,353,358,359,361,367,373,379,382,383,384,385,389,390,394
      ,397,399,400,401,404,409,419,420,421,428,431,432,433,435,439,443,449,454,457,461
      ,462,463,464,467,472,478,479,484,486,487,491,495,499,500,503,509,512,521,523,529
      ,538,541,544,547,548,557,561,562,563,568,569,570,571,576,577,578,587,593,595,596
      ,599,601,607,613,617,619,622,625,630,631,640,641,643,647,648,651,653,656,659,661
      ,665,673,677,683,691,694,701,704,709,714,715,716,719,727,729,733,739,743,751,757
      ,759,761,764,768,769,773,777,780,787,788,795,797,798,800,808,809,811,819,821,823
      ,825,827,829,838,839,840,841,853,856,857,858,859,862,863,864,877,881,883,885,887
      ,903,907,908,911,919,922,924,928,929,930,937,941,944,947,953,956,957,961,967,968
      ,971,972,977,983,991,997,1000]
      
      Haskell> primePowers 12
      [(2,2),(3,1)]
      
      Haskell> primePowers 14
      [(2,1),(7,1)]
      
      您可以硬编码此列表并对其进行测试。我很有信心这些结果没有错误


      (阅读
      是“of”)。

      15有因子5和因子3,它们的总和为8,这不是素数。之所以多次计算因子是有意义的,是因为每个数字都可以分解为素数的唯一乘积,其中每个不同的素数可能出现多次。例如,12=3*2*2,因此2在12的唯一素因子分解中出现了两次。这个问题似乎离题了,因为它是关于询问代码的。14有因子2和7,加起来等于9,而不是prime@DanielDaranas当前位置我不同意——他/她只是在寻找一种自动检查正确性的方法。(想象一下,如果问题是“我写了一个排序函数,想自动检查它的输出,有人知道方法吗?”那么一个有效而有用的答案将是“测试每个元素是否>=前面的元素。”)很快就会复习……去吃晚饭了。哇,OEIS太棒了;我一点也不知道它的存在。为了简单起见,我决定用重数计算素数因子的素数和。然而,根据您的一些建议,我使用diff命令确认了我的程序(通过管道传输到txt文件)和OEIS系列150之间的输出。所以,我的信心增加了,这个解决方案是有效的:-)是的,它是一个整数序列的搜索引擎。有多重性的那一个也在那里,请看我附加在威尔·内斯“令人敬畏的哈斯克尔计划”上的评论。它吐出来了。看起来不错!