C语言中,已知64字节unsigned char数组,找出64字节数组中连续相同的16个字节,有什么好的算法吗?

作者&投稿:羽促 (若有异议请与网页底部的电邮联系)
C语言中 unsigned char和unsigned int的区别~

首先看int和char,分别是整型数据和字符型数据,在计算机里面分别占1个和2个字节空间(TC环境),不同的环境占得字节数可能不同;unsigned int是一个无符号整型数据,而unsigned char则是无符号字符型数据,他们在计算机里所占字节数和int,char完全一样;区别在于unsigned int 与int ( = signed int)型数据范围不同,无符号型数据没有正负之分,而带符号数因为需要用一个数据位存放符号位,所以范围要比无符号数据小,这样,你就能知道unsigned char 和char的区别了!我顺便说一下这四个数据类型各自的范围吧!int (= signed int) -32768 ~ +32767unsigned int 0 ~ 65535char (=signed char) -128 ~ +127
unsigned char 0~255

这个定义是有问题的,我们知道,51内存可供用户使用的是30H~7FH,只有80个字节,定义a[100],那么程序分配时就会出现混乱了,因此出现你现在这个现象是不奇怪的。

给你写了一个,你看看,不懂就追问:

#include<stdio.h>

int main()

{

    unsigned char a[64] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,

    21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,37,38,39,40,41,42,43,44,45,

    46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64};

    int i = 0;

    int j = 1;

    int k = 0;

    for (i=0; i<63; i++)

    {

        if (a[i] == a[i+1])

        {

            if (0==k)

            {

                k = i;// 记录起始位置

            }

            j++;

            if (16==j)

            {

                printf("从第%d位到第%d位相同,相同的值为:%d
", k+1, i+2, a[i]);

                system("pause");

                return 0;

            }

        }

        else

        {

            k=0;

            j=1;

        }

    }

    printf("未找到连续16个相同的字节!
");

    system("pause");

   

    return 0;

}


运行结果:



我的一个算法是一次最多一次遍历数组即可,所以算法时间复杂度为o(n),算法如下:
单次循环遍历数组,在循环中有两下标,前一个下标与后一个下标进行比较,相等,后一下标后指,不等前一下标指向后一下标,后一下标指向下一个下标,继续循环。
代码如下:(注意,百度知道粘贴源码时没有保留我的格式。。。)
//size:the size of array, n: the number of char is the same. you can initial size = 64 and n = 16
int findTheSame(unsigned char* array, int size, int n){
unsigned char pre = array;
unsigned char cur = array+1;
int count = 0;
while(cur != array + size && count < n){
if(*pre != *cur){
pre = cur;
count = 0;
}
else{
count++;
}
cur++;
}
return count < n ? (pre - array) : -1;
}

//a[] = 0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,0
//b[] = 1,2,3,4,1,2,3,4,5,6,7,1,1,2,3,1 //count array

#include<stdio.h>
#define N 16
int main()
{
unsigned char a[N]={0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,0};
int b[N]={1};
int i;
for(i=1;i<N;i++)
{
if(a[i]==a[i-1]) b[i]=b[i-1]+1;
else b[i]=1;
}
for(i=0;i<N;i++) printf("%d ", b[i]);
printf("\n");
return 0;
}

将数据类型直接改成string类的然后调用里面的find函数很轻松就解决了,具体操作百度string类中find函数的用法

模式匹配吗?有个KMP算法你可以百度学习下


C语言,int变量为什么占4个字节?32位64位又是什么意思?
int变量占的字节数取决于机器的指令字长,32位的机器指令就是4字节。32位就是32个二进制位,就是4个字节;64位就是8字节

go语言println和printf?
go的uint64转换成java的哪种类型 Golang和java\/c不同,Go在不同类型的变量之间赋值时需要显式转换。...Go语言用于控制文本输出常用的标准库是fmt fmt中主要用于输出的函数有: Print:输出到控制台,不接受任何...%%???字面上的百分号,并非值的占位符 %c???相应Unicode码点所表示的字符? %x???十六进制表示,...

sizeof在c语言中是什么意思
三、指针与sizeof 在C语言中,指针是存储内存地址的变量。使用`sizeof`可以获取指针本身的大小,而不是它所指向的内容的大小。这一点很重要,因为指针的大小通常与其所在系统的架构有关。例如,在32位系统中,指针通常是4字节,而在64位系统中则是8字节。总结:`sizeof`在C语言中是一个强大的工具,...

中国有多少汉字?
中文汉字堪称世界各种语言文字中笔画最多的一种文字。笔画最多的汉字为:在国务院颁布实施的8105个《通用规范汉字》中,最多笔画的汉字是【齉】字,36画。在GBK字符集中,最多笔画的汉字是【龘】字,48画。在国际标准万国码6版超大字符集中最多笔画的汉字是【𪚥】字,即四个龙繁体“龙”...

字长、字节、字、字位有什么区别?
字长、字节、字、字位的区别:(1)概念不一样 同一时间处理二进制数位数叫字长,字长是直接用二进制代码指令表达的计算机语言。字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位,也在一些计算机编程语言中表示数据类型和语言字符。在计算机领域, 对于某种特定的...

C语言各数据类型所占字节数
- 在16位系统中,整数类型通常占用2字节,其值范围为-32768到32767(无符号类型为0到65535)。而在32、64位系统中,这些类型的存储大小提升到4字节,值范围相应扩展。- 16和32位系统中,整数类型的值范围在-2147483648到2147483647,而在64位系统中,这一范围扩大至-9223372036854775808到9223372036854775807...

在计算机语言中INT是什么意思
1粒米在二进制中表示为1,放到64个格子即为1乘以2的63次方,用INT('1'*64, 2)表示,其计算结果为18446744073709551615。这展示了INT在实际问题中的运算能力。总的来说,INT在计算机语言中不仅是数据类型,更是数值计算的工具,对于理解和处理整数数据以及解决某些特定问题至关重要。

c语言小写a是64吗
是的。在C语言的ASCII码中,小写的字符a代表的数值就是64,大写的字符A代表的数字是98,因此C语言小写a是64。ASCII是基于拉丁字母的一套电脑编码系统,它主要用于显示现代英语和其他西欧语言,是现今最通用的单字节编码系统,并等同于国际标准ISO\/IEC646。

c语言中五种基本数据类型的储存空间长度
1. 整型(int):64位(8字节)。2. 字符型(char):16位(2字节)。3. 单精度浮点型(float):16位(2字节),精度较低。4. 双精度浮点型(double):32位(4字节),精度较高。5. 空类型(void):16位(2字节),在C语言中主要用于函数的返回类型。以上是C语言中五种基本数据类型的...

C语言中一个字节几个位?
  比如:中国,就占用4个字节,例如:char c[] = "中国";\/\/占用4+1 = 5个字符###不只是C语言只要是计算机中的存储单位,那它就一个字节代表八位,顺便说一下1024个字节=1KB, 1024KB=1MB, 1024MB=1GB, 1024GB=1TB。  

讷河市13850854187: - int64 C语言中怎么用 -
朱帘金帅: 示例程序://---------------------------------------------------------------------------#include int main(void) { __int64 a,b; scanf("%I64d",&a); scanf("%I64d",&b); printf("%I64d+%I64d=%I64d\n",a,b,a+b); return 0; }//---------------------------------------------------------------------------

讷河市13850854187: C语言中“unsigned int”占几个字节?跟编译环境和XP 32 位还是64位有关系吗?谢谢 -
朱帘金帅: 都占4个字节,跟32位系统或者64位系统无关.long int取决于系统,long int32位计算机4字节,64位计算机8字节.

讷河市13850854187: c语言中unsigned long的取值范围. -
朱帘金帅: 64位编译器 unsigned long: 8个字节 32位编译器 unsigned long: 4个字节

讷河市13850854187: c语言计算int型数据的字长,求大神详细解释 -
朱帘金帅: 这个和操作系统有关,一般int的长度都会采用机器字长,比如win32系统,int占4字节,32位; 如果是64位主机,int占64位,但这不是一定的,还要看编译器类型等因素. 在C语言中,double、long、unsigned、int、char类型数据所占字节数和...

讷河市13850854187: C语言中(Vc6.0),int, char,double分别占多少字节? -
朱帘金帅: int分为long int和short int,其中long int是4个字节,short int是2个字节. char 1个字节. double 8个字节. 拓展资料: 16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节 unsigned int : 2个字节 float: 4个字...

讷河市13850854187: c语言比较两个数组是否完全相同,有两个数组,全部是41字节长,求c语言代码高效快速的能求出位变量的 -
朱帘金帅: 只比较是否相同:#include<stdio.h> void main() { unsigned int a[41],b[41],*p,*q,c[41]; int i,bSame; bSame=1; for ( i=0,p=a,q=b;i<41;i++,p++,q++ ) if ( *p != *q ) { bSame=0; break; } if ( bSame ) printf("数组相同\n"); else printf("数组不相同\n...

讷河市13850854187: c语言中%d!是什么意思 -
朱帘金帅: %d是用来指定输入和输出时的数据类型和格式,表示“以十进制整数的形式输出”.%a 浮点数、十六进制数字和p-记数法(C99)%A浮点数、十六进制数字和p-记法(C99)%c 一个字符(char) %C 一个ISO宽字符 %d有符号十...

讷河市13850854187: C语言中整数类形的长度
朱帘金帅: 整数类型的长度就是指整型或者长整型多占系统内存空间的长度 就你说的关系的话: unsigned short int 无符号2字节短整形 short int 带符号2字节短整形 - 32768 ~ 32767 unsigned int 无符号4字节整形 0 ~ 2^32 -1 (这个是对的) int 4字节整形 - 2^31 ~ 2^31 - 1 int 64 64位(8字节)整形 - 2^63 ~ 2^63 - 1 (这个很少用到,一般是表示为高位int和低位int,贝式弧现对它的范围也给错了) 希望对你有帮助

讷河市13850854187: c语言32位系统 int a=1234567 可以吗?int不是4字节吗?等于32位二进制,等于 -
朱帘金帅: unsigned short int 无符号2字节短整形 short int 带符号2字节短整形 - 32768 ~ 32767 unsigned int 无符号4字节整形 0 ~ 2^32 -1 (这个是对的) int 4字节整形 - 2^31 ~ 2^31 - 1 int 64 64位(8字节)整形 - 2^63 ~ 2^63 - 1 (这个很少用到,一般是表示为高位int和低位int,贝式弧现对它的范围也给错了) 你上面说的明显超出了int的表示范围,所以是错的;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网