提示:

代码存在问题,这里找出 2008 最多由多少个不同的质数和组成,原先的思路是从最小开始入数组,直到总和大于2008,然后开始剔除,但是这种方法不对

这里为了方便考虑,可以试着将 2008 替换为 16,这样好计算和考虑(2,3,5,7,11,13),按原先的思路是选到了(2,3,5,7),结果是17比原先大1,试着用上 7 的后一位11,来替代已经找到(2,3,5,7)中的两位,使应该剔除的这两位为12比如5,7,但是也挺麻烦。

另外的想法是,虽然考虑从最小入手,直到总和大16不对,但是却可以确定该质数和最多由多少位组成,比如原先思路(2,3,5,7)总和比 16 大1,就可以确定,该质数和最多 3位,不可能是4位,因为最小的四位已经大于它了。这样其实就相当与组合数了即从6位数字中任取3位是否能达到质数和位 16 的要求,不行就2位,以此类推,也挺麻烦。

这些是我的想法,感觉这里应该用回溯法来尝试所有可能,目前没有很好地思路,如果哪位大神有好的思路想法,欢迎提出来一起讨论学习

基础知识

合数指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。与之相对的是质数,而1既不属于质数也不属于合数。最小的合数是4。其中,完全数与相亲数是以它为基础的。

注意

由于记录需要剔除的值的数组b,记录的值是从大到小,因此和最后数组a输出的值进行比较时应该注意

     for(j=0; j<=i; j++) {//          由于在b中存放的需要剔除的值是由大到小排列的因此应使用n--来控制b[k]的值if(a[j]==b[k-1]) {printf("%d剔除\n",a[j]);k--;} else printf("%d\n",a[j]);}

题目

相约2008:2008是一个合数,求出此合数最多由多少个最小不同质数和组成,
并按要求从小到大输出这些质数

关键合数最多由多少个最小不同质数和组成

分析

  1. 先找出2008以内的所有质数存入数组a中
  2. 从0开始扫描数组a相加和为sum,直到值大于或者等于2008,肯定大于(吐槽,不然那简单了)
  3. 计算出sum与2008的差值d,然后从大到小扫描数组a寻找差值d的替代值(即它本身等于差值,或者它本身大于差值,但是下一个值小于差值)
  4. 重复步骤3直到差值为零

代码(有问题)

#include <stdio.h>
#include <math.h>
#define max 2008
int main() {//  数组a记录0-2008内的质数,数组b记录需要剔除的值int a[max],b[max];int i,j,k=0,flag,sum=0,d;//使用a[k]来记录2-2008之间的素数for(i=2; i<=2008; i++) {flag = 1;for(j=2; j<=sqrt(i); j++) {if(i%j==0)    flag = 0;}if(flag) a[k++] = i;}//   计算质数的sum和for(i=0; i<k; i++) {sum = sum+a[i];
//      当sum大于或等于2008时跳出循环if(sum>=2008) {break;}}// 如果sum为2008,满足题目要求输出if(sum==2008) {for(j=0; j<=i; j++)   printf("%d\n",a[j]);}//   当sum大于2008时,关键是a[i]这个值,过大,因此需要将sum-2008的差值使用最大的质数和代替else {printf("此时sum为:%d,比2008大:%d\n",sum,sum-2008);
//      使用前i个值,将差值d逐步化为0,也就是使用将和为d的质数从前i个里面剔除d = sum-2008;k=0;//根据题目要求从大到小扫描 for(j=i; j>=0&&d!=0; j--) {//              如果当前的i值是小于d的最大质数或者等于d则将其记录if((a[j]<d&&a[j+1]>d)||d==a[j]) {d = d - a[j];b[k++] = a[j];}}for(j=0; j<=i; j++) {//          由于在b中存放的需要剔除的值是由大到小排列的因此应使用n--来控制b[k]的值if(a[j]==b[k-1]) {printf("%d剔除\n",a[j]);k--;} else printf("%d\n",a[j]);}}return 0;
}

计算2006的合数,代码写的个别地方不一样(两次写的时间不同)–存在问题

# include "stdio.h"
# include "math.h"
#define max 2006
void main() {int a[max],b[max];int i,j,temp,k=0,flag,sum;for(i=1; i<=2006; i++) {temp = sqrt(i);flag = 1;for(j=2; j<=temp; j++)if(i%j==0) {flag =0;break;}if(flag)  a[k++] = i;}i = sum = k = 0;while(sum<2006) {sum = sum+a[i];i++;}if(sum==2006) {for(j=0; j<i; j++) printf("%d\n",a[j]);} else {temp = sum-2006;for(j=i-1; j>0&&temp!=0; j--) {if(a[j]>temp&&a[j-1]<=temp) {temp = temp - a[j-1];b[k++] = a[j-1];}}k=k-1;sum=0;for(j=0; j<i; j++) {if(a[j]==b[k]) {printf("%d被剔除!!!\n",a[j]);k--;} else {sum = sum + a[j];printf("sum=%d--%d\n",sum,a[j]);}}}
}

相约2008:2008是一个合数,求出此合数最多由多少个最小不同质数和组成, 并按要求从小到大输出这些质数相关推荐

  1. python输入一个正整数n求下列算式的值_C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值。,C语言 编写一个程序,输入一个正整数,求出它是几位数。...

    导航:网站首页 > C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值.,C语言 编写一个程序,输入一个正整数,求出它是几位数. C语言编写程序:输入一个正整数x和一个正整数n,求下 ...

  2. java 求最长重复子串_给定一个字符串,求出其最长的重复子串。

    #include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...

  3. 13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。

    13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中.二维数组中的数已在主函数中 ...

  4. 用户输入一个整数,求出它的各个位数,并求各位数之和

    import java.util.Scanner; //用户输入一个整数,求出它的各个位数,并求各位数之和 public class splitInteger { public static void ...

  5. 给出一个数字求出它的个位、十分位、百分位、千分位、万分位........

    给出一个数字求出它的个位.十分位.百分位.千分位.万分位 求143234的个.十.百.千.万.十万分位 143234%10 -->4 143234/10%10 -->3 143234/10 ...

  6. 输入一个数组,求出这个数组中的逆序对的总数

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  7. 请编写一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。

    #include <iostream> #include<iomanip> using namespace std; #define M 3 #define N 4 /*求出二 ...

  8. C语言试题十五之编写函数void function(int x,int pp[],int *n),求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回

    1. 题目 请编写函数void function(int x,int pp[],int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形 ...

  9. python输入学号姓名输出自我介绍_请编写一个程序,使用字典存储学生信息,学生信息包括学号和姓名,请根据学生学号从小到大输出学生信息。_学小易找答案...

    [单选题]维持人体直立姿势的重要肌 [选择题]2. 对尿失禁患者的护理中错误的一项是( ) [简答题]你印象最深的一处旅游景点是哪里?给你印象深刻的地方在于?有我们的民俗文化元素吗? [判断题]中间继 ...

最新文章

  1. Science:微生物组“淘金热”,从人体中发现新型抗菌剂
  2. javascript2008
  3. Kernel tasklet
  4. Go 语言编程 — gorm ORM 框架
  5. 数论 - 简单数位推理 --- NYIST 514
  6. 《数据库原理与应用(第3版)》——1.4 数据库系统的组成
  7. SpringBoot+Thymeleaf+DataTables实现数据的查询与显示
  8. 再见!妈妈再也不用担心我的计算机基础!
  9. ajax和for循环谁难,关于“for”循环中jquery $ .ajax的问题
  10. oracle关联分组查询,oracle中关联查询、分组查询
  11. mysql中触发器中分隔符_php – 在触发器中使用分隔符的Mysql错误
  12. leetcode力扣617. 合并二叉树
  13. Java单例模式深入详解
  14. CNET:乔布斯留给我们的12条宝贵经验
  15. 东华大学python题库_2020尔雅纺纱学(东华大学)完整答案
  16. CPU的设计原理,数据总线和地址总线
  17. C语言/C++ 平方矩阵 数学最小值解法【简单易懂,代码可以直接运行】
  18. 基于深度学习的图像识别技术研究综述
  19. 从学生到机器视觉工程师,我有话要说!
  20. iOS UITextView 纯英文排版换行出错的解决方案

热门文章

  1. 通用装备综合测试仪(ETest_Tester)
  2. Jmeter察看结果树之CSSJQuery_Tester使用
  3. JavaScript 二维数组的数据写入
  4. 金山词霸2005打sp1补丁时提示未按装词霸2005
  5. App逆向Frida--hook
  6. 抽奖动画_增强您的抽奖动画工作流程
  7. [项目管理-5]:软硬件项目管理 - 项目人力资源管理 (人)
  8. ChatGPT Prompt工程浅谈
  9. 高德地图如何使用自定义底图
  10. js常用插件(九)之移动端翻书效果turn.js