题在标题,思路在代码
#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;
}
运行结果