本周做了一些算法题,主要还是复习了一下学过的知识,然后再学习了一些文件~~~
一.算法题
1.回文质数
我的思路非常粗暴,想着先判断回文数再判断素数,看了别人写的一些文章后,构造回文数再判断素数比较好。
偶数位的回文数都能被11整除
所以一个k位数,可以构造出一个奇数位的回文数。
#include<stdio.h>
int is_prime(int x) {
if(x == 1) return 0;
if(x == 2) return 1;
for(int i = 2; i*i <= x; i++)
{
if(x % i == 0)
return 0;
}
return 1;
}
int main() {
int a, b;
scanf("%d %d", &a, &b);
for(int i = 5; i <= 100000; i ++) {
if(i == 9 && a <= 11 && b >= 11)
{
puts("11");
}
int temp = i/10, ans = i;
while(temp > 0)
{
ans = ans * 10;
ans = ans + tmep%10;
temp /= 10;
}
if(ans > b)
break;
if(ans >= a && is_prime(ans))
printf("%d\n", ans);
}
return 0;
}
2.复习二分查找
如洛谷P2249
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int a[n+5],i;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int j=0;
for(i=0;i<m;i++){
int s,f=0,u;
scanf("%d",&s);
int left=0,right=n-1;
while(left<=right)
{
int middle=(right-left)/2+left;
if(s<a[middle])
right=middle-1;
else if(s>a[middle])
left=middle+1;
else if(s==a[middle])
{
if(middle>0&&a[middle-1]==s)
{
int high=middle,low=0;
while(low<high)
{
int mid=(high+low)/2;
if(a[mid]==s)
high=mid;
if(a[mid]<s)
low=mid+1;
}
printf("%d ",high+1);}
else
printf("%d ",middle+1);
f=1;
break;
}
}
if(f==0)
printf("-1 ");
}
}
二.排序链表,学习了学长的博客,其实就是普通排序的思想
void sort(pnode head)
{
int len,i,j,t;
pnode p,q;
len = length(head);
p=head->next;
for(i = 0,p=head->next;i<len-1;++i,p = p->next)
{
for(j=0,q=p->next;j<len-i-1;++j,q=q->next)
{
if(p->data > q->data)
{
t=p->data;
p->data = q->data;
q->data = t;
}
}
}
}
三.文件
关于文件的函数
1.打开与关闭文件函数分别是fopen和fclose
引用方法:
FILE*fp
fp = fopen(文件名,“使用文件方式”)//文件名是一个字符串
2.顺序读写数据文件:读写字符函数
读字符 fgetc,写字符fputc
检测文件是否介绍的函数:feof(文件指针)~~~(end of file):当文件结束时返回非零值,未结束时返回零
例如下复制文件代码段:
printf("请输入复制后的文件名:\n");
gets(filename);//输入文件名
printf("请输入复制后的文件名:\n");
gets(filename1);
if((p1=fopen(filename,"rb"))==NULL)//打开被复制的文件
{
printf("ERROR");
exit(0);
}
if((p1=fopen(filename,"wb"))==NULL)//打开被复制的文件
{
printf("ERROR");
exit(0);
}
while(!feof(p1))//当返回值是零时执行循环
{
ch=fgetc(p1);//读出每一个p1指向的文件中的字节,把ch写到p2指向的文件中去,若无p2文件,则会建立一个filename1字符数组命名的文件
fputc(ch,p2);
}
printf("复制成功");
fclose(p1);
fclose(p2);//用完之后,为了避免不必要的操作干扰读写,要关闭文件,即断掉文件指针与文件的联系
注:EOF和NULL一样都是标准库里的宏定义,EOF就是-1,NULL代表0
3.用格式化的方式读写文本文件
fscanf和fprintf
格式:
fscanf(fp,"%s",string);
fprintf(fp,"%d",i);
4.rewind函数:将文件内部的指针重新指向一个文件的开头
rewind(文件指针);
fseek函数:文件指针位置函数
fseek(文件指针,位移量,起始量);
ferror函数:检查错误
clearerr函数:使文件错误标志和文件结束标志为零
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~