1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <math.h>
5
6 //穷举法--效率不高
7 int gcd(int a, int b)
8 {
9 int gcd_res;
10 if (a == 0) return b;
11 else if (b == 0) return a;
12 else if (a == b) return a;
13 int gcd_res = a > b ? b : a;
14 while (gcd_res > 1)
15 {
16 if ((a%gcd_res == 0) && (b%gcd_res == 0))
17 {
18 return gcd_res;
19 }
20 gcd_res--;
21 }
22 return gcd_res;
23 }
24 int main()
25 {
26 int a, b;
27 printf("请输入a和b:>");
28 scanf("%d,%d", &a, &b);
29 //最大公约数
30 int gcd_res = gcd(a, b);
31 printf("%d,%d\n", a, b,gcd_res);
32 system("pause");
33 return 0;
34 }
35
36 //相减法
37 int gcd(int a, int b)
38 {
39 int gcd_res;
40 if (a == 0) return b;
41 else if (b == 0) return a;
42 else if (a == b) return a;
43 int gcd_res = a > b ? b : a;
44 while (a!=b)
45 {
46 gcd_res = a > b ? (a -= b) : (b -= a);
47 }
48 return gcd_res;
49 }
50 int main()
51 {
52 int a, b;
53 printf("请输入a和b:>");
54 scanf("%d,%d", &a, &b);
55 //最大公约数
56 int gcd_res = gcd(a, b);
57 printf("%d,%d\n", a, b, gcd_res);
58 system("pause");
59 return 0;
60 }
61
62 //欧几里得辗转相除法
63 int gcd(int a, int b)
64 {
65 int gcd_res;
66 if (a == 0) return b;
67 else if (b == 0) return a;
68 else if (a == b) return a;
69 int mod = a%b;
70 //模数不为0
71 while (mod)
72 {
73 a = b;
74 b = mod;
75 mod = a%b;
76 }
77 return b;
78 }
79 int main()
80 {
81 int a, b;
82 printf("请输入a和b:>");
83 scanf("%d,%d", &a, &b);
84 //最大公约数
85 int gcd_res = gcd(a, b);
86 printf("%d,%d\n", a, b, gcd_res);
87 system("pause");
88 return 0;
89 }
90
91 //辗转相除法--递归法
92 int gcd(int a, int b)
93 {
94 if (b == 0)
95 {
96 return a;
97 }
98 else {
99 return gcd(b, a%b);
100 }
101 }
102 int main()
103 {
104 int a, b;
105 printf("请输入a和b:>");
106 scanf("%d,%d", &a, &b);
107 //最大公约数
108 int gcd_res = gcd(a, b);
109 printf("%d,%d\n", a, b, gcd_res);
110 system("pause");
111 return 0;
112 }
113
114 //最小公倍数--穷举法
115 int lcm(int a, int b)
116 {
117 if (a*b == 0)
118 {
119 return 0;
120 }
121 int lcm_res = a > b ? a : b;
122 while (1)
123 {
124 if ((lcm_res%a == 0) && (lcm_res%b == 0))
125 {
126 break;
127 }
128 lcm_res++;
129 }
130 return lcm_res;
131 }
132 int main()
133 {
134 int a, b;
135 printf("请输入a和b:>");
136 scanf("%d,%d", &a, &b);
137 //最大公约数
138 int gcd_res = gcd(a, b);
139 printf("%d,%d\n", a, b, gcd_res);
140 //最小公倍数
141 int lcm_res = lcm(a, b);
142 printf("%d 和 %d的最小公倍数:>%d\n", a, b, lcm_res);
143 system("pause");
144 return 0;
145 }
146
147 //公式法:lcm=a*b/gcd(a,b)
148 int lcm(int a, int b)
149 {
150 if (a*b == 0)
151 {
152 return 0;
153 }
154 return a*b / gcd(a, b);
155 }
156 int main()
157 {
158 int a, b;
159 printf("请输入a和b:>");
160 scanf("%d,%d", &a, &b);
161 //最大公约数
162 int gcd_res = gcd(a, b);
163 printf("%d 和 %d的最大公约数:>%d\n", a, b, gcd_res);
164 //最小公倍数
165 int lcm_res = lcm(a, b);
166 printf("%d 和 %d的最小公倍数:>%d\n", a, b, lcm_res);
167 system("pause");
168 return 0;
169 }
170
171
172 //求方程的根
173 float disc;
174 float x1, x2;
175 float p, q;
176 void greater_than_zero(int a, int b)
177 {
178 x1 = (-b + sqrt(disc)) / 2*a;
179 x2 = (-b - sqrt(disc)) / 2*a;
180 }
181 void equal_than_zero(int a, int b)
182 {
183 x1 = x2 = -b / 2 * a;
184 }
185 void less_than_zero(int a, int b)
186 {
187 p = -b / 2 * a;
188 q = sqrt(-disc) / 2 * a;
189 }
190 int main()
191 {
192 int a, b, c;
193 printf("请输入 a b c:>");
194 scanf("%d %d %d", &a, &b, &c);
195 disc = b*b - 4 * a*c;//判别式计算
196 if (disc > 0)
197 {
198 greater_than_zero(a, b);
199 printf("disc>0的两个根为:>x1=%f,x2=%f\n", x1, x2);
200 }
201 else if (disc == 0)
202 {
203 equal_than_zero(a, b);
204 printf("disc==0的两个根为:>x1=%f,x2=%f\n", x1, x2);
205 }
206 else
207 {
208 less_than_zero(a, b);
209 printf("disc<0的两个根为:>x1=%f,x2=%f\n", p+q, p-q);
210 }
211 system("pause");
212 return 0;
213 }
214
215
216
217 //求素数--基本的方法
218 #include <stdbool.h>
219 bool IsPrime(int value)
220 {
221 for (int i = 2; i < value/2; ++i)
222 {
223 if (value%i == 0) return false;
224 }
225 return true;
226 }
227 int main()
228 {
229 int value;
230 bool flag;
231 printf("请输入 value:>");
232 scanf("%d", &value);
233 flag = IsPrime(value);
234 if (flag)
235 {
236 printf("%d是素数\n",value);
237 }
238 else{
239 printf("%d不是素数\n",value);
240 }
241 system("pause");
242 return 0;
243 }
244
245 //利用开方的方法
246 bool IsPrime(int value)
247 {
248 for (int i = 2; i < sqrt(value); ++i)
249 {
250 if (value%i == 0) return false;
251 }
252 return true;
253 }
254 int main()
255 {
256 int value;
257 bool flag;
258 printf("请输入 value:>");
259 scanf("%d", &value);
260 flag = IsPrime(value);
261 if (flag)
262 {
263 printf("%d是素数\n", value);
264 }
265 else{
266 printf("%d不是素数\n", value);
267 }
268 system("pause");
269 return 0;
270 }
271
272
273 //二维数组的转置--行列互换
274 void PrintArray(int arr[3][3])
275 {
276 for (int i = 0; i < 3; ++i)
277 {
278 for (int j = 0; j < 3; ++j)
279 {
280 printf("%d ", arr[i][j]);
281 }
282 printf("\n");
283 }
284 }
285 void ReverseArray(int arr[3][3])
286 {
287 for (int i = 0; i < 3; ++i)
288 {
289 for (int j = 0; j < i; ++j)
290 {
291 //转置--交换数据
292 int tmp = arr[i][j];
293 arr[i][j] = arr[j][i];
294 arr[j][i] = tmp;
295 }
296 }
297 }
298 int main()
299 {
300 int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
301 PrintArray(arr);
302 ReverseArray(arr);
303 PrintArray(arr);
304 system("pause");
305 return 0;
306 }
307
308
309 //字符串反序存放
310 void ReverseString(char str[])
311 {
312 int start = 0;
313 int end = strlen(str) - 1;
314 while (start < end)
315 {
316 char tmp = str[start];
317 str[start] = str[end];
318 str[end] = tmp;
319 start++;
320 end--;
321 }
322 }
323 int main()
324 {
325 char str[100] = { 0 };
326 printf("请输入一个字符串:>");
327 gets(str);
328 printf("原始字符串为:>%s\n", str);
329 ReverseString(str);
330 printf("原始字符串为:>%s\n", str);
331 system("pause");
332 return 0;
333 }
334
335
336 //将两个字符串进行连接
337 void LineString(char dest[],char str1[],char str2[])
338 {
339 int i = 0;
340 while (str1[i] != '\0')
341 {
342 dest[i] = str1[i++];
343 i++;
344 }
345 int j = 0;
346 while (str2[j] != '\0')
347 {
348 dest[i++] = str2[j++];
349
350 }
351 //被忘了把\0拷贝进去哦
352 dest[i] = '\0';
353 }
354 int main()
355 {
356 char str1[100] = { 0 };
357 char str2[100] = { 0 };
358 char str[200] = { 0 };
359 printf("请输入第一个字符串:>");
360 gets(str1);
361 printf("请输入第二个字符串:>");
362 gets(str2);
363 LineString(str,str1,str2);
364 printf("新的字符串为:>%s\n", str);
365 system("pause");
366 return 0;
367 }
368
369
370 //将一个字符串中的元音字母复制到另一个字符串
371 void CopyString(char str1[],char str2[])
372 {
373 int i = 0, j = 0;
374 while (str1[i] != '\0')
375 {
376 if (str1[i] == 'a' || str1[i] == 'A' || str1[i] == 'o' || str1[i] == 'O' || str1[i] == 'e' || str1[i] == 'E' || str1[i] == 'i' || str1[i] == 'I' || str1[i] == 'u' || str1[i] == 'U')
377 {
378 str2[j++] = str1[i];
379 }
380 i++;
381 }
382 str2[j] = '\0';
383 }
384 int main()
385 {
386 char str1[100] = { 0 };
387 char str2[100] = { 0 };
388 printf("请输入一串字符:>");
389 gets(str1);
390 printf("原始字符串:> %s\n", str1);
391 CopyString(str2,str1);
392 printf("有元音字符串:> %s\n", str2);
393 system("pause");
394 return 0;
395 }
396
397
398 //输入一个无空格的数字,把这个数字以空格输出
399 void OutString(char digits[])
400 {
401 int i = 0;
402 while (digits[i]!='\0')
403 {
404 printf("%c", digits[i]);
405 if (digits[i + 1] == '\0')
406 {
407 break;
408 }
409 printf(" ");
410 i++;
411 }
412 }
413 int main()
414 {
415 char digits[5] = { 0 };
416 printf("请输入一个4位数字字符串:>");
417 gets(digits);
418 //2022->2 0 2 2
419 OutString(digits);
420
421 system("pause");
422 return 0;
423 }
424
425
426 //统计字符串中的字母、数字、空格、其他字符的个数
427 int letter, digit, space, other;
428 void CountString(char str[])
429 {
430 int i = 0;
431 while (str[i] != '\0')
432 {
433 //统计字母
434 if (str[i] >= 'a'&&str[i] <= 'z' || str[i] >= 'A'&&str[i] <= 'Z')
435 {
436 letter++;
437 }
438 //统计数字
439 else if (str[i] >= '0'&&str[i] <= '9')
440 {
441 digit++;
442 }
443 //空格字符
444 else if (str[i] == ' ')
445 {
446 space++;
447 }
448 //统计其他字符
449 else{
450 other++;
451 }
452 i++;
453 }
454 }
455 int main()
456 {
457 char str[256] = { 0 };
458 printf("请输入一个字符串:>");
459 gets(str);
460 printf("原始字符串为:> %s\n", str);
461 CountString(str);
462 printf("字母个数为%d,数字个数:%d,空格个数:%d,其他个数:%d\n", letter, digit, space, other);
463 system("pause");
464 return 0;
465 }
466
467 int letter, digit, space, other;
468 void CountString(char str[])
469 {
470 int i = 0;
471 while (str[i] != '\0')
472 {
473 //统计字母
474 if (str[i] >= 'a'&&str[i] <= 'z' || str[i] >= 'A'&&str[i] <= 'Z')
475 {
476 letter++;
477 }
478 //统计数字
479 else if (str[i] >= '0'&&str[i] <= '9')
480 {
481 digit++;
482 }
483 //空格字符
484 else if (str[i] == ' ')
485 {
486 space++;
487 }
488 //统计其他字符
489 else{
490 other++;
491 }
492 i++;
493 }
494
495 }
496 int main()
497 {
498 char str[256] = "GoodBye 2021,Hello 2022 Hello World Change World GoodGoodStudy";
499 printf("原始字符串为:> %s\n", str);
500 CountString(str);
501 printf("字母个数为%d,数字个数:%d,空格个数:%d,其他个数:%d\n", letter, digit, space, other);
502 system("pause");
503 return 0;
504 }
505
506
507 //将一个字符串中最长的单词输出
508 void FindLongWord(char str[],char word[])
509 {
510 int i, j;
511 i = j = 0;
512 int len = 0;
513 //同时判断字符串是否结束
514 while (str[i] != '\0'&&str[j]!=' ')
515 {
516 j = i;
517 while (str[j] != ' ')
518 {
519 j++;
520 }
521 len = j - i;
522 if (len > strlen(word))
523 {
524 //拷贝临时最长的单词
525 strncpy(word, str + i, len);
526 }
527 j++;
528 i = j;
529 }
530 }
531 int main()
532 {
533 char line[256] = "A fang abandoned site Han Desert Hill. The fox rabbits swim in groups again. Luxury becomes a spring dream, leaving behind ancient and modern sorrows.";
534 char word[256] = { 0 };
535 FindLongWord(line, word);
536 printf("最长的单词为:> %s\n", word);
537 system("pause");
538 return 0;
539 }
540
541
542 //用起泡法(冒泡排序)对字符由小到大排序
543 void BubbleSort(char str[])
544 {
545 int n = strlen(str);
546 //控制排序的趟数
547 for (int i = 0; i < n - 1; ++i)
548 {
549 //趟数越多,比较的次数越少
550 for (int j = 0; j < n - 1 - i; ++j)
551 {
552 if (str[j]>str[j + 1])
553 {
554 //交换字符
555 char tmp = str[j];
556 str[j] = str[j + 1];
557 str[j + 1] = tmp;
558 }
559 }
560 }
561 }
562 int main()
563 {
564 char str[11] = { 0 };
565 printf("请输入10个字符:>");
566 for (int i = 0; i < 10; ++i)
567 {
568 scanf("%c", &str[i]);
569 }
570 printf("原始字符序列为:> %s\n", str);
571 BubbleSort(str);
572 printf("排序后字符序列为:> %s\n", str);
573 system("pause");
574 return 0;
575 }
576
577
578 //用牛顿迭代法求方程的根
579 double Root(int a, int b, int c, int d, int x)
580 {
581 double x0;
582 double f, f1;
583 do{
584 x0 = x;
585 f = a*pow(x0, 3) + b*pow(x0, 2) + c*x0 + d;
586 f1 = 3 * a*pow(x0, 2) + 2 * b*x0 + c;
587 x = x0 - f / f1;
588 } while (fabs(x-x0)>=1e-3);
589 return x;
590 }
591 int main()
592 {
593 int a, b, c, d;
594 double x;
595 printf("请输入系数 a b c d x:>");
596 scanf("%d %d %d %d %lf", &a, &b, &c, &d, &x);
597 double res = Root(a, b, c, d, x);
598 printf("root = %lf\n", res);
599 system("pause");
600 return 0;
601 }
602
603 //用递归方法求N阶勒让德多项式的值
604 float Poly(int n, int x)
605 {
606 if (n == 0)
607 {
608 return 1;
609 }
610 else if(n==1){
611 return x;
612 }
613 else{
614 return ((2 * n - 1)*x - Poly(n - 1, x) - (n - 1)*Poly(n - 2, x)) / n;
615 }
616 }
617 int main()
618 {
619 int n, x;
620 printf("请输入n和x的值:>");
621 scanf("%d %d", &n, &x);
622 float result = Poly(n, x);
623 printf("%d阶勒让德多项式的值为:> %f\n", n, result);
624 system("pause");
625 return 0;
626 }
627
628
629 //计算10个学生的成绩
630 #define M 10
631 #define N 5
632 //每一位学生的平均分
633 float avg_stu[M];
634 //每一门课程的平均分
635 float avg_course[N];
636 //最高分
637 float highest;
638 //用于记录最高分学生和课程下标
639 int stu_index, course_index;
640 //计算方差
641 float variance;
642 void avg_score_stu(float score[M][N])
643 {
644 float sum = 0.0;
645 for (int i = 0; i < M; ++i)
646 {
647 sum = 0.0;
648 for (int j = 0; j < N; ++j)
649 {
650 sum += score[i][j];
651 }
652 avg_stu[i] = sum / N;
653 }
654 }
655 //计算每门课程的平均分
656 void avg_score_course(float score[M][N])
657 {
658 float sum = 0.0;
659 for (int i = 0; i < N; ++i)
660 {
661 sum = 0.0;
662 for (int j = 0; j < M; ++j)
663 {
664 sum += score[j][i];
665 }
666 avg_course[i] = sum / M;
667 }
668 }
669 float highest_score(float score[M][N])
670 {
671 float highest = 0.0;
672 for (int i = 0; i < M; ++i)
673 {
674 for (int j = 0; j < N; ++j)
675 {
676 if (score[i][j]>highest)
677 {
678 highest = score[i][j];
679 stu_index = i;
680 course_index = j;
681 }
682 }
683 }
684 return highest;
685 }
686 //平均分的方差
687 float variance_avg_score()
688 {
689 float sum_avg_square=0.0;//平均平方和
690 float sum_avg_score=0.0;//平均分的和
691 for (int i = 0; i < M; ++i)
692 {
693 sum_avg_square += (avg_stu[i] * avg_stu[i]);
694 sum_avg_score += avg_stu[i];
695 }
696 return (sum_avg_square / M - (sum_avg_score / M)*(sum_avg_score / M));
697 }
698 //打印结果的函数
699 void print_result(float score[M][N])
700 {
701 printf("NO. cour1 cour2 cour3 cour4 cour5");
702 for (int i = 0; i < M; ++i)
703 {
704 printf("NO.-8%d", i + 1);
705 for (int j = 0; j < N; ++j)
706 {
707 printf("%-8.1f ", score[i][j]);
708 }
709 printf("%-9.1f\n",avg_stu[i]);
710 }
711 //显示每一门课程的平均分
712 printf("%-5s", "avger:>");
713 for (int i = 0; i < N; ++i)
714 {
715 printf("%-9.1f", avg_course[i]);
716 }
717 printf("\n");
718 printf("最高分为:%.1f分,是第%d个同学的第%d门课程\n", highest,stu_index,course_index);
719 printf("平均分的方差为:>%.1f\n", );
720 }
721 int main()
722 {
723 float score[M][N]=
724 {
725 { 1, 2, 3, 4, 5 },
726 { 2, 4, 5, 6, 7 },
727 { 3, 4, 5, 6, 7 },
728 { 4, 5, 6, 7, 8 },
729 { 5, 6, 7, 8, 9 },
730 { 6, 7, 8, 9, 10 },
731 {7,8,9,10,11},
732 {8,9,10,11,12},
733 {9,10,11,12,13},
734 {10,11,12,13,14}
735 };
736 avg_score_stu(score);
737 avg_score_course(score);
738 highest = highest_score(score);
739 variance = variance_avg_score(score);
740 print_result(score);
741 system("pause");
742 return 0;
743 }
744
745
746 //用折半查找法查找员工的姓名
747 #define N 3
748 #define NAME_SIZE 10
749 void Input(int id[], char name[])
750 {
751 for (int i = 0; i < N; ++i)
752 {
753 printf("输入职工号:>");
754 scanf("%d", &id[i]);
755 getchar();//用于忽略所输入的回车符号
756 printf("输入职工的姓名:>");
757 gets(name[i]);
758 }
759 }
760 void Output(int id[], char name[])
761 {
762 for (int i = 0; i < N; ++i)
763 {
764 printf("[%d] : [%s]\n", id, name);
765 }
766 printf("\n");
767 }
768 void Sort(int id[], char name[])
769 {
770 char tmp_name[NAME_SIZE];
771 for (int i = 0; i < N - 1; ++i)
772 {
773 for (int j = 0; j < N - i - 1; ++j)
774 {
775 if (id[j]>id[j + 1])
776 {
777 int tmp_id = id[j];
778 strcpy(tmp_name, name[j]);
779 id[j] = id[j + 1];
780 strcpy(name[j], name[j + 1]);
781 id[j + 1] = tmp_id;
782 strcpy(name[j + 1], tmp_name[j]);
783 }
784 }
785 }
786 }
787 void Search(int id[], char name[], int no)
788 {
789 //折半查找法==二分法查找
790 int low = 0;
791 int high = N - 1;
792 int mid;
793 int key;
794 while (low <= high)
795 {
796 mid = (low + high) / 2;
797 if (key == id[mid])
798 {
799 break;
800 }
801 if (key < id[mid])
802 {
803 high = mid - 1;
804 }
805 else{
806 low = mid + 1;
807 }
808 if (low >= high)
809 {
810 printf("职工号为%d的职工姓名为%s\n", key, name[mid]);
811 }
812 else{
813 printf("要查找的职工号为:%d的职工不存在!");
814 }
815 }
816 }
817 int main()
818 {
819 int id[N];//职工号
820 char name[N][NAME_SIZE];//职工姓名
821 Input(id, name);
822 Output(id, name);
823 int no;
824 while (1)
825 {
826 printf("请输入要查找的职工号:>");
827 scanf("%d", &no);
828 Search(id, name, no);
829 }
830 Sort(id, name);
831 printf("\n");
832 system("pause");
833 return 0;
834 }
835
836
837 //将十六进制转成十进制
838 unsigned HextoDec(char hex[])
839 {
840 int i = 0;
841 unsigned int result = 0;
842 while (hex[i] != '\0')
843 {
844 if (hex[i] >= 'a'&&hex[i] <= 'z')
845 {
846 result = result * 16 + hex[i] - 'a' + 10;
847 }
848 else if (hex[i] >= 'A'&&hex[i] <= 'Z')
849 {
850 result = result * 16 + hex[i] - 'A' + 10;
851 }
852 else{
853 result = result * 16+hex[i]-'0';
854 }
855 i++;
856 }
857 return result;
858 }
859 int main()
860 {
861 char hex[9] = { 0 };
862 printf("请输入一个十六进制数:>");
863 scanf("%x", hex);
864 unsigned int result = HextoDec(hex);
865 printf("0x%s----->%u\n", hex, result);
866 system("pause");
867 return 0;
868 }
869
870
871 //用递归法将一个正数N 转换成一个字符
872 //递归:自己调用自己
873 void Convert(int val)
874 {
875 if ((val / 10) != 0)
876 {
877 Convert(val / 10);
878 }
879 printf("%c", val % 10 + '0');
880 }
881 int main()
882 {
883 int num;
884 printf("请输入一个要转换的字符串:>");
885 scanf("%d", &num);
886 printf("转换之后的字符为:>");
887 Convert(num);
888 printf("\n");
889 system("pause");
890 return 0;
891 }
892
893
894 //给出年月日,计算这一天是这一年的第几天
895 bool IsLeap(int year)
896 {
897 return (year % 4 == 0 && year & 100 != 0 || (year % 400 == 0));
898 }
899 int GetDayByYMD(int year, int month)
900 {
901 int days[13] = { 29, 31, 28, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
902 if (month == 2 && IsLeap(year))
903 {
904 return days[0];
905 }
906 return days[month];
907 }
908 int GetDayByYMD(int year, int month, int day)
909 {
910 int days = 0;
911 for (int i = 1; i < month; ++i)
912 {
913 days += GetDayByYMD(year, i);
914 }
915 days += day;
916 return days;
917 }
918 int main()
919 {
920 int year, month, day;
921 printf("请输入年月日:>");
922 scanf("%d %d %d", &year, &month, &day);
923 int days = GetDayByYMD(year, month, day);
924 printf("%d年%d月%d日是第%d天\n", year, month, day, days);
925 system("pause");
926 return 0;
927 }