1005 继续(3n+1)猜想

在这里插入图片描述

自己写了个解法不能得满分,贴出来看下,我也知道哪里有问题。但是代码真心又臭又长。
思路是这样的:
一个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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值