C语言编程题,求助大神,麻烦给出代码的同时能有结果图,谢谢啦!!!
2020-06-25
第一反应:实际上我不太明白为什么会问这个问题哈哈哈哈,简单看起来没有什么难点,所以我写了一种比较高效的做法,
我的回答效率更高:楼上的回答不可谓不好,但是缺点在于它能够返回的数字有限,对于超过13为的数字就没有办法比较了,而我的做法克服了这一点;同时也可以返回数字的位置(行数,列数);另外我的做法不但能够比较数字,也可以比较字符串,适用范围更广
算法原理:看一看KMP算法,可以实现无回溯比较。
算法效果:
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 20
void swap(char *a, char *b)
{
char temp=*a;
*a=*b;
*b=temp;
}
char * itoa(int num)
{
char * strNum=(char *)calloc(MAXSIZE,sizeof(char));
int i,j;
do
{
strNum[i++]='0'+num%10;
num/=10;
} while (num);
strNum[i]='\0';
for(--i,j=0;j<i;swap(&strNum[i--],&strNum[j++]));
return strNum;
}
int * next_generate(char * p)
{
int * pnext=(int *)calloc(MAXSIZE,sizeof(int));
pnext[0]=-1;
int k,j;
for(k=-1,j=0;p[j];)
{
if(k==-1||p[j]==p[k])
{
j++;
k++;
pnext[j]=k;
}
else
k=pnext[k];
}
return pnext;
}
void KMP(FILE * IN, char * p)
{
int *Jnext=next_generate(p);
int j=0,row=0,col=0;
char c=fgetc(IN);
while(c!=EOF&&p[j])
{
if(j==-1||p[j]==c)
{
j++;
c=fgetc(IN);
col++;
if(c=='\n')
{
col=0;
row++;
}
}
else
{
j=Jnext[j];
}
}
if(!p[j])
{
printf("I find it,below is its position\nrow:%d\ncol:%d",row+1,col-j+1);
return;
}
printf("There is no such number in the file");
}
int main()
{
FILE * ptr=fopen("data.txt","r");
char * strNum=itoa(100);
int * a=next_generate(strNum);
KMP(ptr,strNum);
return 0;
}
希望这个回答能够帮助到你,如果可以的话#能关#注一#下我🐎