1005继续(3n+1)猜想

2024-03-30 05:18
文章标签 继续 猜想 3n 1005

本文主要是介绍1005继续(3n+1)猜想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记录自己的做题历程!

​​​​​​​​​​​​​​https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776

思想:用容器vector去装给出的几个数据(结构体),结构体中有数组,用来装过程中路过的数,还有一个count用来记是否被覆盖过,被覆盖则加1,每结束一个数,遍历数组的数据,将vector中存在的count加一,此数则是被覆盖的,之后不再关注 ,最后只输出count为0的

#include<iostream>
#include<vector>
using namespace std;
struct num{int value;int *arr=new int[1000];int count;
};
int main(){int n;cin>>n;vector<num> num1;for(int i=0;i<n;i++){num a;cin>>a.value;a.count=0;num1.push_back(a);}for(vector<num>::iterator it=num1.begin();it!=num1.end();it++){if(it->count!=0)continue;int k=0,cou=it->value;while(cou>1){if(cou%2==1){cou=cou*3+1;}else{cou=cou/2;}it->arr[k]=cou;k++;}for(vector<num>::iterator its=num1.begin();its!=num1.end();its++){for(int j=0;j<k;j++){if(its->value==it->arr[j])its->count++;}}}int sum=0;for(vector<num>::iterator it=num1.begin();it!=num1.end();it++){if(it->count==0){if(sum>0)cout<<" "<<endl;cout<<it->value;sum++;}}return 0;
}

这段代码只获得部分正确,所以有地方出了问题。

通过测试数据来看,似乎是因为格式问题 ,以及题目要求未看清,要求从大到小输出

改正方法大概是在输入所有数据后进行一个从大到小排序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct num{int value;int *arr=new int[1000];int count;
};
bool comp(num a,num b){//sortreturn a.value>b.value;
}
int main(){int n;cin>>n;vector<num> num1;for(int i=0;i<n;i++){num a;cin>>a.value;a.count=0;num1.push_back(a);}sort(num1.begin(),num1.end(),comp);//different from ordinaryfor(vector<num>::iterator it=num1.begin();it!=num1.end();it++){if(it->count!=0)continue;int k=0,cou=it->value;while(cou>1){if(cou%2==1){cou=cou*3+1;}else{cou=cou/2;}it->arr[k]=cou;k++;}for(vector<num>::iterator its=num1.begin();its!=num1.end();its++){for(int j=0;j<k;j++){if(its->value==it->arr[j])its->count++;}}}int sum=0;for(vector<num>::iterator it=num1.begin();it!=num1.end();it++){if(it->count==0){if(sum>0)cout<<" ";cout<<it->value;sum++;}}return 0;
}

此时对了四个,最后一个不对。

我猜想是不是给出的数据只有1个而且是1?发现确实没有考虑当value为1 的问题

于是我改正了一下,将continue的条件加了一个

 if(it->count!=0||it->value==1){it->count++;continue;}

但是依旧是错的。证明我的思路有个漏洞,但没有找出来

看了一下别人的做法,比我的思路简易

​​​​​​https://github.com/liuchuo/PAT/blob/master/BasicLevel_C++/1005.%20%E7%BB%A7%E7%BB%AD%283n+1%29%E7%8C%9C%E6%83%B3%20%2825%29.cpp

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[10000];//直接创建一个足够大的数组,用于记录被覆盖的数,在最后输出时判断一下这些数是否出现过就可以了,省去了我结构体以及vector遍历的麻烦
bool cmp(int a, int b) {return a > b;}
int main() {int k, n, flag = 0;cin >> k;vector<int> v(k);for (int i = 0; i < k; i++) {cin >> n;v[i] = n;while (n != 1) {if (n % 2 != 0) n = 3 * n + 1;//这里可以化简,是我没想到的,但是这里为什么这里没有记录奇数的情况?n = n / 2;if (arr[n] == 1) break;arr[n] = 1;}}sort(v.begin(), v.end(), cmp);for (int i = 0; i < v.size(); i++) {//v.size的运用if (arr[v[i]] == 0) {if (flag == 1) cout << " ";cout << v[i];flag = 1;}}return 0;
}

 在这里有个疑问,为什么他的没有记录奇数的情况?

等回到学校将回复在评论中或重新发一篇文章。

这篇关于1005继续(3n+1)猜想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/860571

相关文章

猛兽财经:股价暴跌37.6%后,超微电脑股票还能继续投资吗?

来源:猛兽财经 作者:猛兽财经 S&P Global Market Intelligence的数据显示,超微电脑(SMCI)的股价在8月份遭受了两次重创(下跌了37.6%),目前的股价已经较3月份的高点低了64%。   超微电脑股价下跌的原因 第一个原因是,8月6日,超微电脑公布的2024财年第四季度业绩。由于超微电脑的销售成本增长高于收入增长,其收益也远低于华尔街的普遍预期和管理层的

【C++题解】1241 - 角谷猜想

问题二:1241 - 角谷猜想 类型:有规律的循环、递归。 题目描述: 日本一位中学生发现一个奇妙的定理,请角谷教授证明,而教授无能为力,于是产生了角谷猜想。 猜想的内容:任给一个自然数,若为偶数则除以 2 ,若为奇数则乘 3 加 1 ,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为 1 。 请编写代码验证该猜想:求经过多少次运算可得到自然数 1 。 如:输入 22 ,

新换了电脑,电脑里常用的6款软件,下载回来继续用

新换了电脑,准备把之前电脑里常用的几款软件都下载回来继续用,独乐乐不如众乐乐,分享一下~ 1、Listen 1 一款开源、免费的音乐播放器,它能够整合多个主流音乐平台的资源,包括网易云音乐、QQ音乐、酷狗音乐、酷我音乐、Bilibili和咪咕音乐等,可以在一个应用中搜索和播放来自不同平台的音乐。 支持Windows、macOS、Linux,以及Chrome和Firefox浏览器插件版,还有安卓

捷达千里江山首发亮相,捷达品牌2024成都车展继续宠粉不停

2024年8月30日,捷达品牌携新车捷达千里江山惊艳亮相2024成都国际车展,并在五周年之际,发布幸福包油计划等宠粉福利,号召用户打卡千里江山,奔赴美好。与此同时,全新捷达VS5/VS7五周年纪念版车型进一步降低了购车门槛,分别以6.96万元和8.88万元的起售价,继续将宠粉进行到底! 惊艳主场,闪耀全场,捷达千里江山车展首秀 本次车展,首发亮相的捷达千里江山,是由捷达品牌IP——千里江山

九度考研真题 浙大 2008-3浙大1028:继续畅通工程

//题目1028:继续畅通工程 #include<iostream> #include<algorithm> using namespace std; int Tree[1010]; int findRoot(int x){ if(Tree[x]==-1) return x; else { int tmp=findRoot(Tree[x]); Tree[

POJ2262.Goldbach's Conjecture(哥德巴赫的猜想)

【题意】 哥德巴赫猜想:大于四的偶数可以分解为两个奇素数之和 对于给出的数n,如果有多对奇数素数加起来为n,则选择差值b-a最大化的。 若没有这样的一对,则打印"Goldbach's conjecture is wrong." 【思路】 枚举:直接枚举所有的,看是否符合条件,从小到大枚举到中间的话符合条件的也就是差值最大的 #include<stdio.h> #include<string

HDU 1005(矩阵乘法)

A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). 题意:给出一个递推公式,求第N项。 题解:开始试图找出一个能够直接算的递

zdppy+vue3+onlyoffice文档管理系统实战 20240831上课笔记 继续完善登录功能

遗留的问题 1、整合验证码的接口2、渲染验证码3、实现验证码校验的功能4、验证码校验通过之后,再校验登录功能 验证码框架怎么使用 安装: pip install zdppy_captcha 使用示例: import zdppy_api as apiimport zdppy_captchaimport zdppy_cachecache = zdppy_cache.Cache("tm

lua一些排序,后续继续添加

目录 冒泡排序简单选择排序 冒泡排序 --- 打印tablefunction printTB(tb)print("打印tb", table.concat( tb, ", "))end--- 冒泡排序local tbArray = {3,5,7,34,1,78,77,23,-10,33,73,2345,45}function buddle_sort(tbArray)loca

角谷猜想---记忆化搜索

2969 角谷猜想  时间限制: 1 s  空间限制: 32000 KB 题目描述 Description 所谓角谷猜想,即给定一个正整数 n,对 n 反复进行下列两种变换: 1)如果n是偶数,就除以2; 2)如果n是奇数,就乘以3加1。 最后的结果总是1。 我们把从 n 变换到 1 所需要进行的变换次数称做 n 的