1005 继续(3n+1)猜想

mac2024-10-27  9

题目链接 题目难度不大,主要是理解题意; 题目大意为给你一个数字序列,每一个数利用猜想做,在他-》1之前会变成经历很多变化,这些变化会与数字序列中的数重合,我们所要求得即为所有数都利用猜想做一遍,没有与数字序列重合的即为所求 解决方法:利用结构体存了数字和是否出现的标志为,根据猜想来循环,对数组排序,最后输出标志位为0的数字; 最后注意输出格式!

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #pragma warning(disable:4996); #include <iostream> #include<stdio.h> #include<algorithm> #include<string.h> #include<stack> using namespace std; struct num { int x; int count; bool operator < (const num& a)const { return x < a.x; } }; int main() { num a[105]; int n; cin >> n; for (int i = 0;i < n;i++) { cin >> a[i].x; a[i].count = 0; } for (int i = 0;i < n;i++) { int x = a[i].x; while (x != 1) { if (x % 2 == 0) { x = x / 2; for (int j = 0;j < n;j++) { if (a[j].x == x) { a[j].count = 1; } } } else { x = (x * 3 + 1)/2; for (int j = 0;j < n;j++) { if (a[j].x == x) { a[j].count = 1; } } } } } sort(a, a + n); /*int total = 0; for (int i = n - 1;i >= 0;i--) { if (a[i].count == 0) total++; }*/ int flag = 1; for (int i = n - 1;i >= 0;i--) { if (a[i].count == 0 &&flag==1) { cout << a[i].x; flag = 0; continue; } if (a[i].count == 0 && flag == 0) { cout << " " << a[i].x; } } cout << endl; return 0; }
最新回复(0)