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
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define a 1010
typedef struct
{
long long zkz;
int ks;
}stu;
int main()
{
stu stu[a];
int n,sj,ks;
long long int zkz;
scanf("%d",&n);
int i=0;
for(i=0;i<n;i++)
{
scanf("%lld %d %d",&zkz,&sj,&ks);
stu[sj].zkz=zkz; //利用结构体下标来进行一个一个配对
stu[sj].ks=ks;
}
int m=0;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&sj);
printf("%lld %d\n",stu[sj].zkz,stu[sj].ks);
}
return 0;
}

2.选择法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
不同于冒泡排序的一种排序,冒泡是对一个值进行向后位移。
而选择则是每两个进行比较,找到最前面那个
void sort()
{
int arr[10000]
int i=0,j=0;
int m;
for(i=0;i<n-1;i++)
{
m=i;
for(j=i+1;j<n;j++)
{
if(arr[m]>arr[j])
{
m=j;
}
int t=0;
t=arr[m];
arr[m]=arr[i];
arr[i]=t;
}
}
}

3.strchr

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
很好用的一个函数
strchr(a,'a');
在一个字符串中找到a字符,如果找到,返回a字符在这个字符串的地址
如果没找到,返回NULL

实例:L1-011 A-B
代码如下
#include<stdio.h>
#include<string.h>
int main() {
char a[100000], b[100000];

fgets(a,sizeof(a),stdin);
fgets(b, sizeof(b), stdin);
for (int i = 0; i < strlen(a); i++)
{
if (strchr(b, a[i]))
{
continue;
}
else
printf("%c", a[i]);
}
return 0;
}

4.向右对正

1
只需要根据格式%5d即可,不用管正负号,他会自己搞定,不然会报错

5.N个数求和

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
36
37
38
39
40
41
42
43
44
45
46
47
先把我这次绝妙的想法记录下来,输入输出都对了,虽然说答案错误;
#include<stdio.h>
int main()
{
int N = 0;
scanf("%d", &N);
int i = 0;
float sum = 0;
for (i = 0; i < N; i++)
{
int fenmu, fenzi;
scanf("%d/%d", &fenzi, &fenmu);
float fenshu = (float)fenzi / fenmu;
sum = sum + fenshu;
}
if (sum - (int)sum != 0)
{
float xiaoshu = sum - (int)sum;
float j = 0;
float y = 0;
for (y = 1; y < 100; y++)
{
for (j = 1; j < 100; j++)
{
if (y / j > xiaoshu - 0.00001 && y / j < xiaoshu + 0.000001)
{
break;
}
}
if (y / j > xiaoshu - 0.000001 && y / j < xiaoshu + 0.000001)
{
break;
}
}
if ((int)sum != 0)
{
printf("%d %d/%d\n", (int)sum, (int)y, (int)j);
}
else
printf( "%d/%d\n", (int)y, (int)j);
}
else
{
printf("%d\n", (int)sum);
}
return 0;
}

6.很有思路的一集

1
2
3
4
5
6
当对于要输入非常长的整数并且要搞出他的每一位时
我们可以创建char a[10000]数组
并%s输入
最后让他的每一位-'0'即为要求的每一位数字;

<!-- <!-- ~~~ --> -->

7.一个小时插的花!!!

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# define N 99
void flower(char f[][N],int n)
{
char m = n / 2 + 'A';
int i = 0, j = 0;
for (i = 0; i < n; i++)
{
for (j = i; j < n-i; j++)
{
if (m - i <= 'Z')
{
f[i][j] = m - i;
f[j][i] = m - i;
}
else if(m - i > 'Z')
{
f[i][j] = (m - i) -26;
f[j][i] = (m - i) -26;
}
}
}
for (i = n - 1; i >= 0; i--)
{
for (j = i; j > n-1-i; j--)
{
if (m - n + 1 + i <= 'Z')
{
f[i][j] = m - n + 1 + i;
f[j][i] = m - n + 1 + i;
}
else if (m - n + 1 + i > 'Z')
{
f[i][j] = (m - n + 1 + i)-26;
f[j][i] = (m - n + 1 + i)-26;
}
}
}

for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf(" %c", f[i][j]);
}
printf("\n");
}

}
int main()
{
int n = 0;
scanf("%d", &n);
char f[N][N] = {0};
flower(f, n);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
程序文件名】zy11-1.cpp

【题目描述】有n个学生,每个学生的数据包括姓名(10个字符)、出生日期(年-月-日),编写程序,功能是在main函数中输入n个学生信息,调用void sort(struct student stu[],int n)函数(按姓名从小到大排序)排序以后仍在main()中输出排序后的n个学生信息。输出时姓名和出生日期间用一个空格隔开,出生日期的输入输出格式为:yyyy-mm-dd。例如:

输入:2

zhangsan

2004-2-10

lisi

2003-11-20

输出:lisi 2003-11-20

zhangsan 2004-2-10

我的答案

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
36
37
38
39
40
41
42
struct student
{
char name[10];
int year;
int month;
int day;
};
int cmp_stu_name(const void* e1, const void* e2)
{
return strcmp(((struct student*)e1)->name, ((struct student*)e2)->name);
}
void sort(struct student stu[], int n)
{
qsort(stu, n, sizeof(stu[0]), cmp_stu_name);
}
int main()
{
int n = 0;
scanf("%d", &n);
struct student* p = (struct student*)malloc(n * sizeof(struct student));
if (p == NULL)
{
printf("%s", strerror(errno));
return 0;
}
else
{
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%s%d-%d-%d", &p[i].name, &p[i].year, &p[i].month, &p[i].day);
}
sort(p, n);
for (i = 0; i < n; i++)
{
printf("%s %d-%d-%d\n", p[i].name, p[i].year,p[i].month,p[i].day);
}
}
free(p);
p = NULL;
return 0;
}

8.交替合并字符串

给你两个字符串 word1word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

返回 合并后的字符串

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 * mergeAlternately(char * word1, char * word2)
{

char* p1 = word1;
char* p2 = word2;
char* help=(char*)malloc((strlen(word1) + strlen(word2) + 1) * sizeof(char));
memset(help, 0,(strlen(word1) + strlen(word2) +1)*sizeof(char));
int i=0;
while (*p1 && *p2)
{
help[i++] = *p1++;
help[i++] = *p2++;
}
while (*p1)
{
help[i++] = *p1++;
}
while (*p2)
{
help[i++] = *p2++;
}
return help;
}

9.找不同

给定两个字符串 st ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

1
2
3
4
5
6
7
8
9
10
11
12
char findTheDifference(char* s, char* t)
{
char consat[2001];
strcpy(consat,s);
strcat(consat,t);
char add=consat[0];
for(int i=1;consat[i]!='\0';i++)
{
add=add^consat[i];
}
return add;
}

异或的利用,将两个数组合起来,在用数组的第一位去异或即可得到

10.找出字符串中第一个匹配项的下标

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int strStr(char* haystack, char* needle) {
if (haystack == NULL || needle == NULL) {
return -1;
}

int i = 0, j = 0;
while (haystack[i] != '\0' && needle[j] != '\0') {
if ((haystack[i] ^ needle[j])==0) {
i++;
j++;
} else {
i = i - j + 1;
j = 0;
}
}

if (needle[j] == '\0') {
return i - j;
} else {
return -1;
}
}

11.有效的字母异位词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    int cmd_char(const void* e1,const void* e2)
{
return (*(char*)e1-*(char*)e2);
}
bool isAnagram(char* s, char* t)
{
if(strlen(s)!=strlen(t))
{
return false;
}
qsort(s,strlen(s),sizeof(char),cmd_char);
qsort(t,strlen(t),sizeof(char),cmd_char);
return strcmp(s, t) ==0;
}

此处是实在做不出来才写出的下等方法

冶炼金属

小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 �V,�V 是一个正整数,这意味着消耗 �V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 �V 时,无法继续冶炼。

现在给出了 �N 条冶炼记录,每条记录中包含两个整数 �A 和 �B,这表示本次投入了 �A 个普通金属 O,最终冶炼出了 �B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。

根据这 �N 条冶炼记录,请你推测出转换率 �V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。

  • 做题时多想想上线和下线,不要一股脑直接硬做

  • int main()
    {
        int n, a, b;
        int min1 = 0, max1 = 100000;
        scanf("%d", &n);
        while (n--)
        {
            scanf("%d%d", &a, &b);
            min1= fmax(min1, (int)floor(a / (b + 1)) + 1);
            max1 = fmin(max1, (int)floor(a / b));
        }
        printf("%d %d", min1, max1);
    }
    
    1
    2
    3

    # [蓝桥杯 2013 省 B] 翻硬币

    char s[1000]; char t[1000]; int count = 0; int main() { scanf("%s", s); scanf("%s", t); int l = strlen(s); for (int i = 0; i < l; i++) { if (s[i] != t[i]) { s[i] = s[i] == 'o' ? '*' : 'o'; s[i+1] = s[i+1] == 'o' ? '*' : 'o'; count++; } } printf("%d", count); return 0; }
    1
    2
    3
    4
    5

    翻的代码很巧妙

    # k倍区间

#define int long
int N, K;
int qianzhuihe=0;
int map[100000] = {0};
int res;
int main()
{
map[0] = 1;
int a[100000];
scanf(“%d%d”, &N, &K);
for (int i = 0; i < N; i++)
{
scanf(“%d”, &a[i]);
qianzhuihe += a[i];
map[qianzhuihe % K]++;
}
for (int i = 0; i <= K; i++)
{
res = res + map[i] * (map[i] - 1) / 2;
}
printf(“%d”, res);
return 0;
}


利用前缀数同余就有一个k倍区间求得