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 标识是否发生交换,若本轮未发生交换,说明数组已经有序
*/
}
回顾结束