demo_3_22

  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 }

 

posted @ 2022-03-22 23:02  小团熙  阅读(71)  评论(0)    收藏  举报