相约2008:2008是一个合数,求出此合数最多由多少个最小不同质数和组成, 并按要求从小到大输出这些质数
提示:
代码存在问题,这里找出 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是一个合数,求出此合数最多由多少个最小不同质数和组成,
并按要求从小到大输出这些质数
关键合数最多由多少个最小不同质数和组成
分析
- 先找出2008以内的所有质数存入数组a中
- 从0开始扫描数组a相加和为sum,直到值大于或者等于2008,肯定大于(吐槽,不然那简单了)
- 计算出sum与2008的差值d,然后从大到小扫描数组a寻找差值d的替代值(即它本身等于差值,或者它本身大于差值,但是下一个值小于差值)
- 重复步骤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是一个合数,求出此合数最多由多少个最小不同质数和组成, 并按要求从小到大输出这些质数相关推荐
- python输入一个正整数n求下列算式的值_C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值。,C语言 编写一个程序,输入一个正整数,求出它是几位数。...
导航:网站首页 > C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值.,C语言 编写一个程序,输入一个正整数,求出它是几位数. C语言编写程序:输入一个正整数x和一个正整数n,求下 ...
- java 求最长重复子串_给定一个字符串,求出其最长的重复子串。
#include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...
- 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所指一维数组中.二维数组中的数已在主函数中 ...
- 用户输入一个整数,求出它的各个位数,并求各位数之和
import java.util.Scanner; //用户输入一个整数,求出它的各个位数,并求各位数之和 public class splitInteger { public static void ...
- 给出一个数字求出它的个位、十分位、百分位、千分位、万分位........
给出一个数字求出它的个位.十分位.百分位.千分位.万分位 求143234的个.十.百.千.万.十万分位 143234%10 -->4 143234/10%10 -->3 143234/10 ...
- 输入一个数组,求出这个数组中的逆序对的总数
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 请编写一个函数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 /*求出二 ...
- C语言试题十五之编写函数void function(int x,int pp[],int *n),求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回
1. 题目 请编写函数void function(int x,int pp[],int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形 ...
- python输入学号姓名输出自我介绍_请编写一个程序,使用字典存储学生信息,学生信息包括学号和姓名,请根据学生学号从小到大输出学生信息。_学小易找答案...
[单选题]维持人体直立姿势的重要肌 [选择题]2. 对尿失禁患者的护理中错误的一项是( ) [简答题]你印象最深的一处旅游景点是哪里?给你印象深刻的地方在于?有我们的民俗文化元素吗? [判断题]中间继 ...
最新文章
- Science:微生物组“淘金热”,从人体中发现新型抗菌剂
- javascript2008
- Kernel tasklet
- Go 语言编程 — gorm ORM 框架
- 数论 - 简单数位推理 --- NYIST 514
- 《数据库原理与应用(第3版)》——1.4 数据库系统的组成
- SpringBoot+Thymeleaf+DataTables实现数据的查询与显示
- 再见!妈妈再也不用担心我的计算机基础!
- ajax和for循环谁难,关于“for”循环中jquery $ .ajax的问题
- oracle关联分组查询,oracle中关联查询、分组查询
- mysql中触发器中分隔符_php – 在触发器中使用分隔符的Mysql错误
- leetcode力扣617. 合并二叉树
- Java单例模式深入详解
- CNET:乔布斯留给我们的12条宝贵经验
- 东华大学python题库_2020尔雅纺纱学(东华大学)完整答案
- CPU的设计原理,数据总线和地址总线
- C语言/C++ 平方矩阵 数学最小值解法【简单易懂,代码可以直接运行】
- 基于深度学习的图像识别技术研究综述
- 从学生到机器视觉工程师,我有话要说!
- iOS UITextView 纯英文排版换行出错的解决方案