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 }