常考,但不会的题,多敲几遍死记硬背

1.法雷序列

照着敲的一遍

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct fraction{
    int fz,fm;
    struct fraction *next;
}fra;
void divide(fra *a,fra *b,int n)
{
    if(a->fm+b->fm>n)
        return ;
    fra *temp=(fra *)malloc(sizeof(fra));
    temp->fz=a->fz+b->fz;
    temp->fm=a->fm+b->fm;
    a->next=temp;
    temp->next=b;
    divide(a,temp,n);
    divide(temp,b,n);
}
int main() {
    int n;
    scanf("%d",&n);
    fra *head=(fra *)malloc(sizeof(fra));
    head->fz=0,head->fm=1;
    fra *tail=(fra *)malloc(sizeof(fra));
    tail->fz=1,tail->fm=1;
    head->next=tail;
    tail->next=NULL;
    divide(head,tail,n);
    fra *p=head->next;
    while(p!=NULL)
    {
        printf("%d/%d ",p->fz,p->fm);
        p=p->next;
    }
    return 0;
}

自己尝试敲的一遍

void divide(fra *a,fra *b,int n)
{
    fra *temp=(fra *)malloc(sizeof(fra));
    a->next=temp;
    temp->next=b;
    divide(a,temp,n);
    divide(temp,b,n);
}
int main()
{
    int n;
    scanf("%d",&n);
    fra *head=(fra *)malloc(sizeof(fra));
    head->fz=0,head->fm=1;
    fra *tail=(fra *)malloc(sizeof(fra));
    tial->fz=1,tail->fm=1;
    divide(head,tail,n);
    fra *p=head->next;
    while(p!=NULL)
    {
        printf("%d/%d",p->fz,p->fm);
        p=p->next;
    }
    return 0;
}

对比一下,70%相似度

继续自己开敲

#include<stdio.h>
#include<stdlib.h>
typedef struct fraction{
    int fz,fm;
    struct fraction *next;
}fra;
void divide(fra *a,fra *b,int n)
{
    if(a->fm+b->fm>n)
        return;
    fra *temp=(fra *)malloc(sizeof(fra));
    temp->fz=a->fz+b->fz;
    temp->fm=a->fm+b->fm;
    a->next=temp;
    temp->next=b;
    divide(a,temp,n);
    divide(temp,b,n);
}
int main()
{
    int n;
    scanf("%d",&n);
    fra *head=(fra *)malloc(sizeof(fra));
    head->fz=0,head->fm=1;
    fra *tail=(fra *)malloc(sizeof(fra));
    tail->fz=1,tail->fm=1;
    head->next=tail;
    tail->next=NULL;
    divide(head,tail,n);
    fra *p=head->next;
    while(p!=NULL)
    {
        printf("%d/%d",p->fz,p->fm);
        p=p->next;
    }
    return 0;
}
    

完美,成功复刻,再多看两眼。过两个小时重温一下

2.高斯消元法

照着敲一遍

void deduce(float a[N][N])
{
    int i,j,k;
    float coeff;
    for(k=0;k<N;k++){
        for(i=k+1,i<N;i++){
            coeff=a[i][k]/a[k][k];
            for(j=k;j<N;j++){
                a[i][j]=a[k][j]*coeff-a[i][j];
            }
        }
    }
}

自己敲一遍,口诀:i循环里i在前,j循环里j在后且全勤;

void deduce(float a[N][N])
{
    int i,j,k;
    float coeff;
    for(int k=0;k<N;k++){
        for(int i=k+1;i<N;i++){
            coeff=a[i][k]/a[k][k];
            for(int j=k;j<N;j++){
                a[i][j]=a[k][j]*coeff-a[i][j];
            }
        }
    }
}

3.约瑟夫问题

照着敲一遍

int josephus(int n,int m,int start)
{
    int dead[n];
    for(int i=0;i<n;i++)
        dead[i]=0;
    int index=start-1;
    for(int i=0;i<n-1;i++){
        int count=0;
        while(count<m){
            if(!dead[index])
                count++;
            if(count<m)
                index=(index+1)%n;
        }
        dead[index]=1;
        printf("%d",index+1);
    }
    for(int i=0;i<n;i++){
        if(!dead[i])
            return i+1;
    }
    return -1;
}

自己敲

int func(int n,int m,int start)
{
    int dead[n]={0};
    int index=start-1;
    int count=0;
    while(count<m){
        if(!dead[index])
            count++;    
        if(count<m)
            index=(index+1)%m;
    }
    dead[index]=1;
    printf("%d",index+1);
    for(int i=0;i<n;i++)
        if(!dead[i])
            return i+1;
    return -1;
}

掉个for循环。。真纯背了,代码逻辑都不看,汗流浃背了

int func(int n,int m,int start)
{
    int dead[n]={0};
    int index=start-1;
    for(int i=0;i<n-1;i++)
    {
        int count=0;
        while(count<m)
        {
            if(!dead[index])
                count++;
            if(count<m)
                index=(index+1)%n;
        }
        dead[index]=1;
        printf("%d",index+1);
    }
    for(int i=0;i<n;i++)
        if(!dead[i])
            return i+1;
    return -1;
}

4.统计单词个数

实际就是strtok的用法不熟练,思路很好理解,照着敲一遍

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define MAX_WORDS 1000
#define MAX_LEN 10
typedef struct{
    char word[MAX_LEN+1];
    int cnt;
}Word;
int main()
{
    char text[MAX_WORDS];
    Word words[MAX_WORDS];
    int wordcnt=0;
    gets(text);
    char *token=strtok(text," ,.!?;\n");
    while(token!=NULL&&wordcnt<MAX_WORDS){
        for(int i=0;token[i];i++)
            token[i]=tolower(token[i]);
        int found=0;
        for(int i=0;i<wordcnt;i++)
        if(strcmp(words[i].word,token)==0){
            words[i].cnt++;
            found=1;
            break;
        }
        if(!found){
            strcpy(words[wordcnt].word,token);
            words[wordcnt].cnt=1;
            wordcnt++;
        }
        token=strtok(NULL," ,.!?\n");
    }
    for(int i=0;i<wordcnt;i++)
        printf("%s:%d\n",words[i].word,words[i].cnt);
}

自己尝试敲一遍(洗个澡出来全忘完了,随再照着敲一遍)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAX_WORD 1000
#define MAX_LEN 10
typedef struct{
    char words[MAX_LEN+1];
    int cnt;
}WORD;
int main()
{
    char text[MAX_WORD];
    gets(text);
    WORD word[MAX_WORD];
    int wordcnt=0;
    char *token=strtok(text," ,.!?\n");
    while(token!=NULL&&wordcnt<MAX_WORD)
    {
        for(int i=0;token[i];i++)
            token[i]=tolower(token[i]);
        int found=0;
        for(int i=0;i<wordcnt;i++){
            if(strcmp(word[i].words,token)==0){
                word[i].cnt++;
                found=1;
                break;
            }
        }
        if(!found){
            strcpy(word[wordcnt].words,token);
            word[wordcnt].cnt=1;
            wordcnt++;
        }
        token=strtok(NULL," ,.!?\n");
    }
    for(int i=0;i<wordcnt;i++)
        printf("%s:%d\n",word[i].words,word[i].cnt);
}
        

真的自己敲一遍了

//节约时间 省略头文件及预定义

int main()
{
    char text[1000];
    gets(str);
    WORD w[1000];
    int wordcnt=0;
    char *token=strtok(text," ,.!?\n");
    while(token!=NULL&&wordcnt<1000)
    {
        for(int i=0;token[i];i++)
            token[i]=tolower(token[i]);
        int fount=0;
        for(int i=0;i<wordcnt;i++)
            if(strcmp(w[i].words,token)==0)
            {
                w[i].cnt++;
                found=1;
                break;        //欧克 ,这遍忘了加这个break了
            }
        if(!found)
        {
            strcpy(w[wordcnt].words,token);
            w[wordcnt]=1;
            wordcnt++;
        }
        token=strtok(NULL," ,.!?\n");
    }
    for(int i=0;i<wordcnt;i++)
        printf("%s:%d",w[i].words,w[i].cnt);
}
        
                

5.n个数取k个数,求排列

照着敲

#include<stdio.h>
void func(int n,int k,int start,int depth,int a[])
{
    if(depth==k){
        for(int i=0;i<k;i++)
            printf("%d",a[i]);
        printf("\n");
        return ;
    }
    for(int i=start;i<=n;i++){
        a[depth]=i;
        func(n,k,i+1,depth+1,a);
    }
}
int main()
{
    int n=5,k=2;
    int a[k];
    func(n,k,1,0,a);
    return 0;
}

试图背下来,自己敲一遍,(敲不下来一点)

void func(int n,int k,int start,int depth,int a[])
{
    if(depth==k)
    {
        for(int i=0;i<k;i++)
            printf("%d",a[i]);
        printf("\n");
        return ;
    }
    for(int i=start;i<=n;i++)
    {
        a[depth]=i;
        func(n,k,i+1,depth+1,a);
    }
}
//GGGG全是抄的

看两眼,再试一遍,拿下了家人们

void func(int n,int k,int start,int depth,int a[])
{
    if(depth==k)
    {
        for(int i=0;i<k;i++)
            printf("%d",a[i]);
        printf("\n");
        return ;
    }
    for(int i=start;i<=n;i++)
    {
        a[depth]=i;
        func(n,k,start+1,depth+1,a);
    }
}

6.分数除法,有循环节输出循环节

有点复杂在的,还涉及了memmove,一脸懵啊家人们,真考到就拣点分吧,纯背

int main()
{
    int N,D;
    scanf("%d/%d",&N,&D);
    if(N%D==0){
        char *res=malloc(sizeof(char)*20);
        sprintf(res,"%d",N/D);
        return 0;
    }
    char *res=malloc(sizeof(char)*100);
    int len=0;
    if((N<0)^(D<0))
        res[len++]='-';
    N=abs(N);
    D=abs(D);
    sprintf(res+len,"%d",N/D);
    len=strlen(res);
    int r=N%D;
    if(r==0)
        return res;
    res[len++]='.';
    int remain[10000];
    memset(remain,-1,sizeof(remain));
    while(r!=0){
        if(remain[r]!=-1){
            int start=remain[r];
            int end=len;
            res=(char *)realloc(res,(len+3)*sizeof(char));
            memmove(res+start+1,res+start,end-start);
            res[start]='(';
            res[end+1]=')';
            res[end+2]='\0';
            return 0;
        }
        remain[r]=len;
        r*=10;
        res[len++]='0'+(r/D);
        r%=D;
    }
    return 0;
}

7.链表冒泡排序

确实可以偷鸡,就是不交换实际节点,只交换节点值

void BubbleSort(LNode *head)
{
    int flag, temp;
    LNode *ptr, *lptr = NULL;  // 初始化指针 ptr 和 lptr
    if (head == NULL)  // 如果头结点为空,直接返回
        return;
    do {
        flag = 0;  // 标志,如果某次遍历没有发生交换,则说明已经有序
        ptr = head;  // 指针 ptr 指向链表头结点
        while(ptr->next != lptr) {  // 遍历链表,直到lptr为止
            if(ptr->data > ptr->next->data) {  // 如果当前节点的值大于下一个节点的值
                temp = ptr->data;  // 交换两个节点的数据
                ptr->data = ptr->next->data;
                ptr->next->data = temp;
                flag = 1;  // 标记发生了交换
            }
            ptr = ptr->next;  // 指针移动到下一个节点
        }
        lptr = ptr;  // lptr 指向最后一次发生交换的位置
    } while (flag);  // 如果本轮遍历发生了交换,则继续下一轮
    /* 此处实现的是冒泡排序算法,每次遍历时将最大值冒泡到末尾
       lptr 每次记录最后一次交换的位置,减少无效遍历
       flag 标识是否发生交换,若本轮未发生交换,说明数组已经有序
    */
}

回顾结束

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值