湖南工业大学笔记 其一

湖南工业大学刷题笔记

2.1.8

1.最大公约数:

1
2
3
4
5
6
7
8
9
10
11
//辗转相除法
int s(int a,int b){
while(a!=0){
int c=a%b;
b=a;
a=c;
}
return b;
}
//最小公倍数:
int min=(a*b)/s(a,b);

3.1.1,2

1.闰年判断条件:

1
//年份%400=0  或者  年份%4=0并且年份%100!=0

2.冒泡排序:

1
2
3
4
5
6
7
8
9
10
11
int s[n];
for(int i=0;i<n-1;++i){
for(int j=0;j<n-1-i;++j){
if(s[j]<s[j+1]){
int tmp;
tmp=s[j];
s[j]=s[j+1];
s[j+1]=tmp;
}
}
}

4.2.5

1.寻找完数:

范围对半除找

5.1.5*

1.亲密数问题:

1
2
3
4
5
6
7
8
//求一个数的约数之和
void calculateDivisors() {
for (int i = 1; i<n; ++i) {
for (int j = i*2; j <n; j += i) {
sumDivisors[j] += i;//累加约数
}
}
}

5.2.3

1.拆分数字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//拆分数字分别输出的时候,除了while循环,还可以用递归的回溯功能来实现它的顺逆顺序
void s(int n){
while(n!=0){
int a=n%10;
n/=0;//逆向输出
}
}
void s(int n){
if(n==0) return;
int a=n%10;
//printf("%d",a);逆
s(n/10);
//printf("%d",a);顺
}

6.1.7,5*,4

1.杨辉三角问题:

1
2
3
4
5
6
7
8
9
10
11
12
int s[n][n]
//首先可以先把两边的1给设出来
for(int i=0;i<n;++i){
s[i][0]=1;//第一列
s[i][i]=1;//最后一列
}
//然后就用循环开始填中间数即可
for(int i=2;i<n;++i){
for(int j=1;j<i;++j){
s[i][j]=s[i-1][j]+s[i-1][j-1];
}
}

2.二分寻找最小编号问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int fen(int s[n],int n,int t){
int l=0;
int r=n-1;
int mid,id;
while(r>=l){
mid=l+(r-l)/2;//确保不越界
if(s[mid]==t){
id=mid+1;
r=mid-1;//向左边继续查找,寻找最小的
}
else if(s[mid]<t){
l=mid+1;
}
else if(s[mid]>t){
r=mid-1;
}
}
return id;
}

3.鞍点问题:

1
//关键在于分别对每个情况的鞍点判断,并且标记

6.2.6

1.字符串按照字典大小顺序排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//char*类型,因为c语言中没有string类型,所以可以用char*str来存储字符串的首地址,注意,是首地址,假如是apple,那么str存储的就是a的地址。
//而比较的时候strncmp是一个个字符地往后比较,所以给它首个字符串足以
//下面比较函数中要加**的原因是,a原本是一个未被定义的指针,所以转换的时候,要把它重复转换成我们需要的类型的指针,所以要**
int compare(const void*a,const void *b){
const char**str1=(const char **)a;
const char**str2=(const char **)b;
return strncmp(*str1,*str2,100);//这里因为strncmp的参数要是一个字符串的首字符,所以还要进行解指针操作
}

int main(){
char *s[3];
for(int i=0;i<3;++i){//这里要用strdup来赋内存,直接赋值是不行的,strdup用于复制赋值
char buffer[100];
scanf(" %s",buffer);
s[i]=strdup(buffer);

}
qsort(s,3,sizeof(char*),compare);
for(int i=0;i<3;++i){
printf("%s\n",s[i]);
free(s[i]);//最后要释放内存
}
return 0;
}

7.1.(4*),3

1.约瑟夫问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//约瑟夫问题总的来说就是围绕:当前下标,计数器,剩余人数来展开
#include <stdio.h>

int main() {
int n;
scanf("%d",&n);
int s[n];
for(int i=0;i<n;++i){
s[i]=i+1;
}
int current=0;//当前下标
int count=0;//计数器
int remaining=n;//剩余数量
while(remaining>1){

if(s[current]!=0){
count++;
if(count==3){
//printf("%d",s[current]);
s[current]=0;
count=0;//注意要重置计数器
remaining--;
}
}
current=(current+1)%n;

}
for(int i=0;i<n;++i){
if(s[i]!=0){
printf("%d",s[i]);
}
}
return 0;
}

2.strcmp函数

1
2
3
4
5
6
7
8
9
10
11
12
13
//这道题就是模拟strcmp函数。因为strcmp函数内部其实是从首字符开始比较,可以利用qsort中compare参数正负的情况来写
int strcmp(char *p1, char *p2){
while(*p1!='\0' && *p2!='\0'){
if(*p1>*p2) {
return 1;
} else if(*p1<*p2){
return -1;
}
p1++;
p2++;
}
return 0;
}

9.1.2,1

1.找到in.txt文件并写入helloworld

1
2
3
4
5
6
7
8
9
#include<stdio.h>
void slove(){
FILE *A;
A=fopen("in.txt","w");
//没有就创建
fprintf(A,"helloworld");
fclose(A);
}

2.从文件in.txt中读取文件

1
2
3
4
5
6
7
8
9
#include<stdio.h>
//假如文件格式是10 20 30
void slove(){
FILE *a=fopen("in.txt","r");
int a,b,c;
if(fscanf("%d %d %d",&a,&b,&c)!=3){
fclose(a);
}
}