自己写了个解法不能得满分,贴出来看下,我也知道哪里有问题。但是代码真心又臭又长。
思路是这样的:
一个number数组输入数字,然后将数组中的每个数字按照题目要求分解,将所有的分解出来的数字存在process数组中。该数组的下标就是存入的数字,标记为1.然后将这些数字提取出来,存在fit数组里面,fit数组便得到了所有数字分解过程的数字,然后对比输入的数字。输入中有的,分解数组中没有的即是关键数字。这个代码能得19/25.
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a, int b)
{
return a>b;
}
int main()
{
int number[100], number1[100],fit[100] = { }, fit2[100] = { }, process[100] = { }; //process全部赋值为0
int m; //m numbers
int n,i,j=0,count=0,k;
int flag1 = 0,flag2=0;
cin >> m;
for ( i = 0; i < m; i++)
{
cin >> n;
number[i] = n;
number1[i] = n;
}
for (i = 0; i < m; i++) //执行完之后,process中为1的数组下标就是能被覆盖的数
{
while (number[i] != 1)
{
if (number[i] % 2 == 0) //偶数
{
number[i] = number[i] / 2;
process[number[i]] = 1;
}
else
{
number[i] = (3 * number[i] + 1) / 2;
process[number[i]] = 1;
}
}
}
for (i = 0; i <= 100; i++)
if (process[i] == 1)
{
fit[j++] = i; //fit里面存所有计算过的数字
}
for (i = 1; i <= 100; i++)
{
flag1 = 0, flag2 = 0;
for (k = 0; k < j; k++)
if (fit[k] == i)
flag1 = 1;
for (k = 0; k < m; k++)
if (number1[k] == i)
flag2 = 1;
if (flag2 == 1 && flag1 == 0)
fit2[count++] = i;
}
sort(fit2, fit2 + count, cmp);
for (i = 0; i < count; i++)
{
if (i < count - 1)
cout << fit2[i] << " ";
else
cout << fit2[i];
}
return 0;
}
正确解法参看这位博主:
https://blog.csdn.net/qq_37729102/article/details/81590513
思路是:每一个数字都和除了数字之外的其他数字的分解过程来比较,实时比较。我上面那个思路就是先分解完存下来,最后在比较。
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)//sort函数本来是默认升序的,要降序得自己写个函数
{
return a>b;
}
bool cover(int *a, int j, int length, int number) //传入一个数字number,和一个下标j,将数字a[j]按题目分解,判断number是否在分解序列中。(1001那个题)
{
int n = a[j];
while (n != 1)
{//如果n变化后等于关键字,说明n即a[pos]覆盖待比较数,返回真
if (n % 2 == 0)
{
n /= 2;
if (n == number)
return true;
}
else
{
n = (3 * n + 1) / 2;
if (n == number)
return true;
}
}
return false;//如果循环结束,说明n即a[i]不覆盖待比较数,返回假
}
bool judge(int *a, int i, int length) //传过来一个数组下标i,写一个循环判断a[i]之外的其他数字能否covera[i]
{
for (int j = 0; j < length; i++)
{
if (j != i)
{
if (cover(a, j, length, a[i]))
return false;
}
}
return true;
}
int main()
{
int a[100],b[100]; //a是输入的数组,b是符合条件的数组用于输出
int m,n,i,length=0; //length 是满足条件的数组的长度
cin >> m;
for (i = 0; i < m; i++)
{
cin >> n;
a[i] = n;
if (judge(a, i, m)) //对于输入的数组的每一个值都去judge是否符合
b[length++] = a[i];
}
sort(b, b + length, cmp);//通过接口调用排序算法
for (int i = 0; i<length; i++)//输出
{
cout << b[i];
if (i != length - 1)
cout << ' ';
}
return 0;
return 0;
}