给一串数字,判断是否连续

题在标题,思路在代码

#include<stdio.h>

int main()
{
	int arr[] = { 8 , 3, 2, 6, 4, 5, 3, 7 };	//一组任意数字
	int sz = sizeof(arr) / sizeof(arr[0]);		//求任意数字数量
	int Min = arr[0];				//假设第一个数字为最小
	int count = 0;					//统计数字排列状况
	int num = 0;					//统计重复数字数目
	
	int i = 0;
	do
	{
		if (arr[i] < Min)				//2、如果当前数字小于当前最小值
		{
			count = (count << (Min - arr[i]));	//   将count整体左移当前最小值与当前数字差值
			count++;				//   count加一,将当前数字放在第一位
			Min = arr[i];				//   替换最小值
		}
		else
		{						//3、如果当前数字大于于目前最小数字
			if (count&(1 << (arr[i] - Min)))	//   看次数字是否出现过
			{
				num++;				//   出现过,num加一
			}
			else
			{
				count |= 1 << (arr[i] - Min);	//1、 count第一个二进制位表示最小数字,
			}					//    左边n个位置表示(Min+n),数字出现该位置放1
		}						// “|=”也可以是“^=”,因为重复数字不会运行此句
		i++;
	} while (i < sz);					//每一个数字都进入判断

	while (count % 2)		//%2为1表示第一个二进制位为1
	{
		count /= 2;		//去掉第一个二进制位
	}
	if (count)			//当count>0时,表示二进制的1不连续,即所给数字不连续
	{
		printf("不连续\n");
	}
	else
	{				//否则,二进制
		printf("有%d个连续数,%d个重复数字\n", (sz - num), num);
	}
	return 0;
}

运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值