你好,代码的思路都在注释里了,有什么不懂的地方可以回复哦~#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
int abstract(char s[],int t[])
{
/**********Program**********/
int i,j=0,k=0,m=1,sum=0,cnt=0;
for(i=0; s[i]; i++)
{
char h[10]={0};
if(s[i]>='0'&&s[i]<='9')j=i;//j为定位用,定位到第一个数字出现的位置。
while(s[j]>='0'&&s[j]<='9')
{
h[k++]=s[j++]; //从j位置开始找,找到不是数字的字符位置,这之间所有的数字赋值到另一个字符串中
}
h[k]=0;
if(h[0]){
t[cnt++]=atoi(h); //把这个字符串转换为数字(也可以用循环转换,这里为方便使用了函数)
i=j; //我们把i定位到数字最后一位的后一位,没有这句话,例如扫到了11,会把后边的1也扫进去。
}
k=0; //用来存储新的数字
}
return cnt;
/********** End **********/
}
void move( int t[], int n)
{
/**********Program**********/
int i=0,j=0,k,flag=1,m=n;
for(i=0;i<n;i++)
{
//判断素数的算法
flag=1;
for(j=2;j<=sqrt(t[i]);j++)
{
if(t[i]%j==0)
flag=0;
}
//解释下为什么下面用m,我的意思是把这个素数后面的都往左挪,那么肯定要从这个素数的位置扫到最后一位。
//n--的原因是后边已经移动完的素数就不用再移动了。就是从0-n开始扫。没有这句话会重复扫已经扫过的素数,已经排好的素数就乱了顺序。
//总结:n是检测素数用,m是移动素数用。
if(flag)
{
int temp=t[i];
for(k=i;k<m-1;k++)
{
t[k]=t[k+1];
}
t[m-1]=temp;
i=0;n--;
}
}
/********** End **********/
}
int main()
{
char s[]={"yu11asd18**6$abc3jui17t*r33t10?qwe31nm19jj21da"};
int t[20],i,n;
FILE *fp;
if((fp=fopen("data.dat","w"))==NULL)
{
printf("File open error\n");
exit(0);
}
n=abstract(s,t);
move(t,n);
for(i=0;i<n;i++)
{
printf("%d ",t[i]);
fprintf(fp,"%d ",t[i]);//这里有改动,t是个数组,循环要输出t[i]而不是t。
}
fclose(fp);
return 0;
}
|