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; }
给你两个字符串 word1 和 word2 。请你从 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; }
给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 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; }
异或的利用,将两个数组合起来,在用数组的第一位去异或即可得到
给你两个字符串 haystack 和 needle ,请你在 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; } }
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);
}
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;
}
#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倍区间求得