第八周学习记录

目录

一、学习知识

1、欧拉筛法

2、大数(+、-、*)

 3、队列

4、桶排

5、埃式筛法 

7、栈    

8、快速幂 

9、BFS(重点)

二、刷题(本周刷有25题:选其中几个)

1、1687  H  骨牌铺方格2

2、1686 E 智兵点将

3、1686 D 实验室的聚餐

4、1684 J 字符串操作一(串)

5、1685 B YRZ学长的随机数


一、学习知识

1、欧拉筛法

分析(1)、计算1到n之间的素数

       (2)、用一数组a(全赋值1默认全素数)记录1到n之间的状态,用一数组b装素数

       (3)、1级大循环开始时检测从2开始时 a[i]状态是1还是0,是1  b[m++]=a[i];接下来2级小循环j=0开始将 b中素数给*i 即 a[i*b[j]]=0;改变(素数倍数一定不是素数)记录状态,注意循环范围

       (4)、最后输出 b中元素

附代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(int argc, char *argv[])
  4. {   int n,flig[1000],i,j,sux=0;;
  5.     while(scanf("%d",&n)!=EOF)
  6.     {sux=0;
  7.     int su[1000];
  8.       memset(flig,1,sizeof(flig));
  9.    
  10.     for(i=2;i<=n;i++)
  11.     {if(flig[i])
  12.         su[sux++]=i;
  13.         for(j=0;i*su[j]<=n;j++)
  14.         {flig[i*su[j]]=0;
  15.          if(i%su[j]==0)break;
  16.      }
  17.     }
  18.     for(i=0;i<sux;i++)
  19.     printf("%d\n",su[i]);
  20.     }
  21.     return 0;
  22. }

2、大数(+、-、*)

分析(1)、进行很大的数之间的数学运算

       (2)、将我们输入的数存入字符串中后在赋给整形数组,并右对齐

       (3)、通过循环从右往左对位检测,按照数学计算方式,计算

附代码(大数 (加)  其他概念一样 就数学实现方式不一样)

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {  int sa[100]={0},sb[100]={0},js[100]={0},i,j;
  5.    int ac=0,bc=0,zz,duo=0;
  6.    char a[100],b[100];
  7.     gets(a);gets(b);
  8.     ac=strlen(a);bc=strlen(b);
  9.     for(i=100-ac,j=0;i<100;i++)
  10.     sa[i]=a[j++]-'0';
  11.     for(i=100-bc,j=0;i<100;i++)
  12.     sb[i]=b[j++]-'0';
  13.     if(ac>bc)zz=ac;
  14.     else if(bc>ac)zz=bc;
  15.     else zz=ac;
  16.     
  17.     for(i=99;zz>0;i--,zz--)
  18.     {js[i]=(sa[i]+sb[i]+duo)%10;
  19.         duo=(sa[i]+sb[i]+duo)/10;
  20.         if(zz-1<=0&&duo!=0){js[--i]+=duo;}
  21.     }
  22.     
  23.     for(i=i+1;i<100;i++)
  24.     printf("%d",js[i]);
  25.     
  26.     return 0;
  27. }

3、队列

分析(1)、先进先出,一端进行插入(入队列 队尾),另一端进行删除(出队列 队首)

        (2)、实现 运用链表结构或数组

附代码(函数实现)

  1. typedef struct {
  2.     int arr[SIZE];
  3.     int head; 
  4.     int tail; 
  5.                
  6. }queue;
  7. void queue_init(queue *queue) {
  8.     queue->head = 0;
  9.     queue->tail = 0;
  10. }
  11. void deinit(queue *queue) {
  12.     queue->head = 0; 
  13. }
  14. int size(const queue *queue) {
  15.     return (queue->tail - queue->head);
  16. }
  17. int empty(const queue *queue) {
  18.     return !(queue->tail - queue->head);
  19. }
  20. int full(const queue *queue) {
  21.     return queue->tail >= SIZE;
  22. }
  23. int push(queue *queue, int val) {
  24.     if(queue_full(queue)) {
  25.         return 0;
  26.     }
  27.     else {
  28.         queue->arr[queue->tail] = val;
  29.         queue->tail++;
  30.         return 1;
  31.     }
  32. }
  33. int pop(queue *queue, int *num) {
  34.     if(queue_empty(queue)) {
  35.         return 0;
  36.     }
  37.     else {
  38.         *num =queue->arr[queue->head];/
  39.         queue->head++;
  40.         return 1;
  41.     }
  42. }
  43. int front(const queue *queue, int *num) {
  44.    if(enpty(queue)) {
  45.         return 0;
  46.    }
  47.    else {
  48.         *num = queue->arr[queue->head];
  49.         return 1;
  50.    }
  51. }

4、桶排

分析(1)、按照函数映射方法将不同的数据放入不同的桶中

        (2)、将每个桶内排好序,在依次取出桶中数据

附代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct fw
  4. {int a;
  5.  struct fw *next;
  6. }tp;
  7. int main(int argc, char *argv[])
  8. {    int a[10],i,j,index;
  9.     tp **to,*p,*q,*s;
  10.     for(i=0;i<10;i++)scanf("%d",&a[i]);
  11.     to=(tp**)malloc(sizeof(tp*)*10);
  12.     for(i=0;i<10;i++)
  13.     {to[i]=(tp*)malloc(sizeof(tp));
  14.       to[i]->a=-1;
  15.       to[i]->next=NULL;
  16.     }
  17.     for(i=0;i<10;i++)
  18.     { s=(tp*)malloc(sizeof(tp));
  19.      s->next=NULL;
  20.       s->a=a[i];
  21.       index=a[i]/100;
  22.       p=to[index];q=p->next;
  23.       if(to[index]->a==-1)to[index]=s;
  24.       else if(s->a<to[index]->a){to[index]=s;s->next=p;}
  25.             else {while(q&&s->a>q->a){p=q;q=q->next;}p->next=s;s->next=q;}
  26.     }
  27.     for(i=0;i<10;i++)
  28.     if(to[i]->a==-1)continue;
  29.     else {p=to[i];while(p){printf("%d ",p->a);p=p->next;}}
  30.     return 0;
  31. }

5、埃式筛法 

分析(1)、算1-n之间素数

        (2)、用一数组a装1-n之间的数,循环从i=2开始到i<=sqrt,在小循环i<=n将i的倍数a[i]=0,依次循环,知道结束

          (3)、输出时判断a每个元素的状态为0就不输出,其他就是素数

附代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int main(int argc, char *argv[])
  5. {
  6.     int n,*a,i,j=0;
  7.     scanf("%d",&n);
  8.     a=(int*)malloc(sizeof(int)*(n+1));
  9.     a[0]=0;
  10.     for(i=1;i<=n;i++)a[i]=i;
  11.     for(i=2;i<=sqrt(n);i++)
  12.     for(j=i;j<=n;j=j+i)
  13.     {if(j!=i)a[j]=0;}
  14.     for(i=2;i<=n;i++)
  15.     if(a[i]!=0)printf("%d ",a[i]);
  16.     return 0;
  17. }           

6、归并排

分析(1)、运用递归,将数组分成左右两部分,依次递归下去,直到只剩2个不能分了,

       (2)、在通过递归进行从下往上的合并并排序

  1. #include<stdio.h>
  2. void shuchu(int a[], int b) {
  3.     int i;
  4.     for (i=0;i<b;i++) {
  5.         printf("%d ", a[i]);
  6.     }
  7. }
  8. void pai(int arr[], int start, int z, int end) {
  9.     int zhang[20];
  10.     int k = 0;
  11.     int i = start;
  12.     int j = z + 1;
  13.     while (i <= z && j <= end) {
  14.         if (arr[i] < arr[j]){
  15.             zhang[k++] = arr[i++];
  16.         }
  17.         else{
  18.             zhang[k++] = arr[j++];
  19.         }
  20.     }
  21.     if (i == z + 1) {
  22.         while(j <= end)
  23.             zhang[k++] = arr[j++];
  24.     }
  25.     if (j == end + 1) {
  26.         while (i <= z)
  27.             zhang[k++] = arr[i++];
  28.     }
  29.     for (j = 0, i = start ; j < k; i++, j++) {
  30.         arr[i] = zhang[j];
  31.     }
  32. }
  33. void gui(int a[], int start, int end) {
  34.     if (start >= end)
  35.         return;
  36.     int z = ( start + end ) / 2;
  37.     gui(a, start, z);gui(a, z + 1, end);
  38.     pai(a, start, z, end);
  39. }
  40. int main()
  41. {
  42.     int a[] = {9, 8, 1, 3, 5, 1, 7, 2, 4, 6};
  43.     gui(a, 0, 9);
  44.     shuchu(a, 10);
  45.     return 0;
  46. }

7、栈    

分析(1)、运用结构体 先进后出

       (2)、注意创建栈  入栈 出栈

附代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. typedef struct{
  5.     char data[100];
  6.     int to;
  7.     int di;
  8. }stack;
  9. stack *cj()
  10. {
  11.     stack *p=(stack*)malloc(sizeof(stack));
  12.     p->di=p->to=0;
  13.     return p;
  14. }
  15. void jr(stack *p,char str){
  16.     p->data[p->to]=str;
  17.     p->to++;
  18. char chuzhan(stack *p,char str){
  19.     if(p->to!=p->di){
  20.         str=p->data[p->to-1];
  21.         p->to--;
  22.         return str;
  23.     }
  24. void shuchu(stack *p){
  25.     while(p->to!=p->di){
  26.         printf("%c",p->data[p->to-1]);
  27.         p->to--;
  28.     }
  29. }
  30. int main(){
  31.     int i;
  32.     stack *p;
  33.     char a[100];
  34.     gets(a);
  35.     p=cj();
  36.     for(i=0;i<strlen(a);i++)
  37.     jr(p,a[i]);
  38.      printf("\n");
  39.     shuchu(p);
  40. }
     

8、快速幂 

分析(1) 、通过循环检测次方状态(a^b) 偶数 b次方折半 底数a自己*自己 奇数时用另一个变量b

 接收即b*=a 次方时负数时 b/=a 就相到与  把次方是奇数时 底数提出一个 次方减了个一  变成偶数了 ,在折半,知道b=1;

附代码

  1.  #include <stdio.h>
  2. #include <math.h>
  3. float pow(float a,int b)
  4. { float ans=1;
  5.   while(b)
  6.   {if(b&1)
  7.      {if(b>0)
  8.        ans*=a;
  9.         else ans/=a;
  10.      }
  11.       b=b/2;
  12.       a*=a;
  13.   }
  14.   return ans;     
  15. }
  16. int main(int argc, char *argv[])
  17. {   float a;
  18.     int b;
  19.     scanf("%f%d",&a,&b);
  20.        printf("%f",pow(a,b));
  21.     return 0;
  22. }

9、BFS(重点)

分析(1)、要运用队列和结构体

        (2)、先给队首赋根节点

        (3)、找可拓展点入队 如果没有了就将队首出队

        (4)、要定义对下标数组记录已找过的点

        (5)、重复(3)没有可拓展或已找到停止

附代码

  1. #include <stdio.h>
  2. #include <queue.h>
  3. typedef struct bfs
  4. {int a;
  5.  int b;
  6. }dui;
  7. queue<dui> r;
  8. int dx[4]={0,1,0,-1};
  9. int dy[4]={1,0,-1,0};
  10. int k1,k2,n;
  11. char a[100][100];
  12. int v[100][100]={0};
  13.     
  14. int main()
  15. {   int i,w1,w2;
  16.     while(scanf("%d",&n)!=EOF)
  17.     {int k=0;
  18.      getchar();
  19.     for(i=0;i<n;i++)
  20.     {gets(a[i]);}
  21.     scanf("%d%d%d%d",&w1,&w2,&k1,&k2);
  22.     
  23.     dui to;
  24.     to.a=w1;
  25.     to.b=w2;
  26.     
  27.     r.push(to);
  28.     v[w1][w2]=1;
  29.     
  30.     while(!r.empty())
  31.     {int x=r.front().a,y=r.front().b;
  32.       if(x==k1&&y==k2)
  33.       {printf("Yes\n");k=1;break;}
  34.            
  35.       int i;
  36.       for(i=0;i<=3;i++)
  37.       {int tx,ty;
  38.        tx=x+dx[i];
  39.        ty=y+dy[i];
  40.        if(a[tx][ty]!='*'&&v[tx][ty]==0&&tx>=0&&tx<n&&ty>=0&&ty<n)
  41.           {dui temp;
  42.          temp.a=tx;
  43.          temp.b=ty;
  44.          r.push(temp);
  45.          v[tx][ty]=1;  
  46.         }
  47.         }
  48.         r.pop();
  49.     }
  50.      if(k==0)printf("No\n");
  51.     }
  52.     return 0;
  53. }

二、刷题(本周刷有25题:选其中几个)

1、1687  H  骨牌铺方格2

题解(1)先给定1、2、3定值从第4个开始等于前3个相加。

  1. #include <stdio.h>
  2. int main()
  3. {   int n;
  4.    while(scanf("%d",&n)!=EOF)
  5.    {long long a[100]={0};
  6.     int i=n;
  7.     a[1]=1;a[2]=2;a[3]=4;
  8.     if(i>3)for(i=4;i<=n;i++)
  9.            {a[i]=a[i-1]+a[i-2]+a[i-3];}
  10.      
  11.     printf("%lld\n",a[i>3?i-1:i]);
  12.    }
  13.      
  14.     return 0;
  15. }

2、1686 E 智兵点将

题解(2)以7的倍数为基准 加上用户输入最终%7的余数 %3和5 等于 用户输入最终的%3 和5的余数时 停止循环 输出此时 7的倍数加上用户输入最终%7的余数

  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {  int a,b,c,i,j=1,k;
  4.    scanf("%d%d%d",&a,&b,&c);
  5.    while(1)
  6.    {k=7*(j++);
  7.        if((k+c)%5==b&&(k+c)%3==a)break;
  8.    }
  9.    printf("%d",k+c);
  10.     return 0;
  11. }

3、1686 D 实验室的聚餐

题解(3)用一维数组记录醉酒状态,全赋1(表示初始状态都没醉)用一变量记录报数状态,用一变量记录人数好让数组到最后一人时返回开头,报道最后数的人赋0(醉),此时下一个人报数值归1;当检测到当前人时0,就跳过,下一个人往后报,当记录醉酒人数的变量加到男生的人数时,结束循环,最后输出时检测数组状态0就输出B,1就输出G。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. int main()
  5. {  
  6.     int n,m,i,z=0,j=0,h=0,a[10000],k;
  7.     char x;
  8.     while((x=scanf("%d%d",&n,&m))!=EOF)
  9.     {
  10.      memset(a,1,sizeof(int)*10000);
  11.      i=0;z=n;j=0;
  12.       
  13.      while(z>0)
  14.      {
  15.       if(a[i]!=0)j++;
  16.       if(j==m){a[i]=0;z--;j=0;}
  17.       i++;
  18.       if(i>=2*n)i=0;
  19.      }
  20.     for(i=1;i<=2*n;i++)
  21.     {if(a[i-1]==0)putchar('B');
  22.       else putchar('G');
  23.       if(i%50==0)printf("\n");
  24.     }
  25.     printf("\n\n");
  26.    }
  27.     return 0;
  28. }

4、1684 J 字符串操作一(串)

题解(4)将字符串分成左右两部分分别左右交换

  1. #include <stdio.h>
  2. #include <string.h>
  3. void jh(char a[100],int m,int n)
  4. {int i,j,ac;
  5.  char c;
  6.  ac=strlen(a);
  7.  for(i=0,j=ac-1;i<=m&&j>=n;i++,m--,j--,n++)
  8.  {c=a[i];a[i]=a[m];a[m]=c;
  9.   c=a[j];a[j]=a[n];a[n]=c;    
  10.  }
  11.  puts(a);
  12. }
  13. int main(int argc, char *argv[])
  14. {  char a[100];
  15.     while(scanf("%s",&a)!=EOF)
  16.     {int i,j;
  17.      if(strlen(a)%2==0)
  18.        {i=strlen(a)/2-1;
  19.         j=strlen(a)/2;
  20.        jh(a,i,j);
  21.        }
  22.       else 
  23.        {i=strlen(a)/2-1;
  24.           j=strlen(a)/2+1;
  25.        jh(a,i,j);
  26.        }
  27.     }
  28.     return 0;
  29. }

5、1685 B YRZ学长的随机数

题解(5)用数字记录随机数,当用户输入随机数时,就在数组内检测是否重复,没重复就将此数在数组内排序。

  1. #include<stdio.h>
  2. int main()
  3. {   int N,num[100]={0},i,j,k,m;
  4.     scanf("%d",&N);
  5.     for(i=0;i<N;i++)
  6.         scanf("%d",&num[i]);
  7.     for(i=0;i<N-1;i++)
  8.       {k=i;
  9.         for(j=i;j<N;j++)
  10.             if(num[k]>num[j])
  11.                 k=j;
  12.         if(k!=i)
  13.         {m=num[i];
  14.          num[i]=num[k];
  15.          num[k]=m;
  16.         }
  17.       }
  18.       for(i=0;i<N-1;i++)
  19.       {k=i;
  20.           if(num[k]==num[i+1])
  21.            { for(k;k<N;k++)
  22.                num[k]=num[k+1];
  23.         N--;i--;
  24.       }}
  25.       printf("%d\n",N);
  26.       for(i=0;i<N;i++)
  27.         printf("%d ",num[i]);
  28.     return 0;
  29. }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值