各种基本算法实现小结(七)—— 常用算法

来源:互联网 发布:淘宝电子书商城 编辑:程序博客网 时间:2024/05/16 09:05

各种基本算法实现小结(七)—— 常用算法

(均已测试通过)

======================================================================

1、判断素数

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. #include <math.h>  
  3. int is_sushu(int n)  
  4. {  
  5.     int i, mid;  
  6.     mid=(int)sqrt(n);  
  7.     for(i=2; i<=mid; i++)  
  8.         if(0 == n%i)  
  9.             return 0;  
  10.     return 1;  
  11. }  
  12. void main()  
  13. {  
  14.     int n;  
  15.       
  16.     printf("Enter a num: ");  
  17.     scanf("%d", &n);  
  18.     if(is_sushu(n))  
  19.         printf("%d is sushu!/n", n);  
  20.     else  
  21.         printf("%d is not sushu.../n", n);  
  22. }  

运行结果:

    

==========================================================

2、 求2-1000之间的所有素数

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. #include <math.h>  
  3. #define MAX 1000  
  4. int is_sushu(int n)  
  5. {  
  6.     int i, mid;  
  7.     mid=(int)sqrt(n);  
  8.     for(i=2; i<=mid; i++)  
  9.         if(0 == n%i)  
  10.             return 0;  
  11.     return 1;  
  12. }  
  13. void main()  
  14. {  
  15.     int i, count;  
  16.       
  17.     count=0;  
  18.       
  19.     for(i=2; i<=MAX; i++)  
  20.         if(is_sushu(i))  
  21.         {  
  22.             count++;  
  23.             printf("%5d", i);  
  24.                 if(0 == count%10)  
  25.                     printf("/n");  
  26.         }  
  27.     printf("/n");  
  28. }  

运行结果:

==========================================================

3、 验证哥德巴赫猜想

哥德巴赫猜想:任意一个大于等于6的偶数都可以分解为两个素数之和

如: 6 = 3+3;100 = 3+97=11+89; 1000 = 3+997=59+941=。。。

 

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. #include <math.h>  
  3. #define MAX 1000  
  4. int is_sushu(int n)  
  5. {  
  6.     int i, mid;  
  7.     mid=(int)sqrt(n);  
  8.     for(i=2; i<=mid; i++)  
  9.         if(0 == n%i)  
  10.             return 0;  
  11.     return 1;  
  12. }  
  13. void main()  
  14. {  
  15.     int i, mid, n;  
  16.       
  17.     printf("Enter an even num: ");  
  18.     scanf("%d", &n);  
  19.       
  20.     mid=n/2;  
  21.     for(i=2; i<=mid; i++)  
  22.     {  
  23.         if(is_sushu(i) && is_sushu(n-i))  
  24.             printf("%d = %d + %d/n", n, i, n-i);  
  25.     }  
  26.       
  27. }  

运行结果:

       

==========================================================

4、 求最大公约数(GCD)和最小公倍数(LCM)

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. void  max_min(int &m, int &n)  
  3. {  
  4.     int tmp;  
  5.     if(m<n)  
  6.     {  
  7.         tmp=m;  
  8.         m=n;  
  9.         n=tmp;  
  10.     }  
  11. }  
  12. int Cal_GCD(int m, int n)  
  13. {  
  14.     int gcd;  
  15.       
  16.     max_min(m, n);  
  17.     gcd=m%n;  
  18.     while(gcd)  
  19.     {  
  20.         m=n;  
  21.         n=gcd;  
  22.         gcd=m%n;  
  23.     }  
  24.     return n;  
  25. }  
  26. void main()  
  27. {  
  28.     int m, n, gcd;  
  29.       
  30.     printf("Enter two num a b: ");  
  31.     scanf("%d %d", &m, &n);  
  32.     gcd=Cal_GCD(m, n);  
  33.     printf("%d and %d GCD: %d/n", m, n, gcd);  
  34.     printf("%d and %d LCM: %d/n", m, n, m*n/gcd);  
  35. }  

运行结果:

==========================================================

5、统计个数(数字)

用随机函数产生100个[0,99]范围内的随机整数,

统计个位上的数字分别为0,1,2,3,4,5,6,7,8,9的数的个数并打印出来

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <time.h>  
  4. #include <string.h>  
  5. #define MAX 101  
  6. void input(int num[])  
  7. {  
  8.     int i;  
  9.     srand((unsigned)time(NULL));  
  10.     for(i=1; i<MAX; i++)  
  11.         num[i]=rand()%100;  
  12. }  
  13. void output(int num[])  
  14. {  
  15.     int i;  
  16.     for(i=1; i<MAX; i++)  
  17.     {  
  18.         printf("%5d", num[i]);  
  19.         if(0==i%10)  
  20.             printf("/n");  
  21.     }  
  22.     printf("/n");  
  23. }  
  24. void cal_num(int num[], int count[])  
  25. {  
  26.     int i, mod;  
  27.       
  28.     for(i=1; i<MAX; i++)  
  29.     {  
  30.         mod=num[i]%10;  
  31.         count[mod]++;  
  32.     }  
  33. }  
  34. void main()  
  35. {  
  36.     int num[MAX];  
  37.     int i, count[10];  
  38.       
  39.     memset(count, 0, 10*sizeof(int)); /* initial count[] to 0 */  
  40.     input(num);  
  41.     printf("100 num:/n");  
  42.     output(num);  
  43.       
  44.     cal_num(num, count);  
  45.     for(i=0; i<10; i++)  
  46.         printf("%d: %d/n", i, count[i]);      
  47. }  

运行结果:

==========================================================

6、统计个数(数字、字符、其它字符)

输入一行字符,统计其中有多少个数字、字符和其它字符

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #define MAX 1024  
  4. void cal_num(char *str, int count[])  
  5. {  
  6.     char *pstr;  
  7.     pstr=str;  
  8.     while(*pstr) /* *pstr != 0 */  
  9.     {  
  10.         if(*pstr>='0' && *pstr<='9')  
  11.             count[0]++;  
  12.         else if((*pstr>='a' && *pstr<='z') || (*pstr>='A' && *pstr<='Z'))  
  13.             count[1]++;  
  14.         else  
  15.             count[2]++;  
  16.           
  17.         pstr++;  
  18.     }  
  19. }  
  20. void main()  
  21. {  
  22.     char str[MAX];  
  23.     int i, count[3];  /* 0->num; 1->char; 2->others */  
  24.     memset(count, 0, 3*sizeof(int));  
  25.       
  26.     printf("Enter a string: ");  
  27.     scanf("%s", str);  
  28.     cal_num(str, count);  
  29.     for(i=0; i<3; i++)  
  30.     {  
  31.         switch(i)  
  32.         {  
  33.             case 0:  
  34.                 printf("num: %d/n", count[i]);  
  35.                 break;  
  36.             case 1:  
  37.                 printf("char: %d/n", count[i]);  
  38.                 break;  
  39.             case 2:  
  40.                 printf("other: %d/n", count[i]);  
  41.                 break;  
  42.         }  
  43.     }  
  44. }  

运行结果:

==========================================================

7、 数制转换(递归实现)

本算法仅实现了基数为2-16的数制转换

如果大家希望扩展范围,仅需要对基数表示字符case 进行扩展即可,如G、H、I ...

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. int flag=1; /* check: n/d == 0 */  
  3. void trans_num(int n, int d)  
  4. {  
  5.     int mod;  
  6.     mod=n%d;  
  7.     n=n/d;  
  8.     while(flag && n)  
  9.         trans_num(n,d);  
  10.     flag=0;  
  11.     switch(mod)  
  12.     {  
  13.         case 10:  
  14.             printf("A");  
  15.             break;  
  16.         case 11:  
  17.             printf("B");  
  18.             break;  
  19.         case 12:  
  20.             printf("C");  
  21.             break;  
  22.         case 13:  
  23.             printf("D");  
  24.             break;  
  25.         case 14:  
  26.             printf("E");  
  27.             break;  
  28.         case 15:  
  29.             printf("F");  
  30.             break;  
  31.         default:  
  32.             printf("%d", mod);    
  33.     }  
  34.           
  35. }  
  36. void main()  
  37. {  
  38.     int n, d;  
  39.     printf("Enter n d: ");  
  40.     scanf("%d %d", &n, &d);  
  41.       
  42.     trans_num(n, d);  
  43.     printf("/n");     
  44. }  

运行结果:

         

 

算法改进

数制直接转为字符输出,扩展支持16进制以上的数制转换

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. int flag=1; /* check: n/d == 0 */  
  3. void trans_num(int n, int d)  
  4. {  
  5.     int mod;  
  6.     mod=n%d;  
  7.     n=n/d;  
  8.     while(flag && n)  
  9.         trans_num(n,d);  
  10.     flag=0;  
  11.     if(mod>=10)  
  12.         mod=mod-10+65;  /* convert to char */  
  13.     else  
  14.         mod=mod+48;  
  15.     printf("%c", mod);  /* print char (%c) */     
  16. }  
  17. void main()  
  18. {  
  19.     int n, d;  
  20.     printf("Enter n d: ");  
  21.     scanf("%d %d", &n, &d);  
  22.       
  23.     trans_num(n, d);  
  24.     printf("/n");     
  25. }  

运行结果(扩展进制):

                

100 = 4*24+4            1000=1*24*24+17*24+16  10000=17*24*24+8*24+16        1000=27*36+28

==========================================================

8、 数制转换(栈实现)


 

核心思想和递归实现类似,都是压栈的原理,实现较简单,请自己尝试实现

==========================================================

9、 水仙花数

水仙花数简述: 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。

如:153=1^3+5^3+3^3(3位数);1634=1^4+6^4+3^4+4^4(4位数);54748=5^5+4^5+7^5+4^5+8^5(5位数)

 

判断任一3位数,是否为水仙花数

测试环境:GCC

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. main()  
  3. {  
  4.     int b, s, g, n, sum;  
  5.     scanf("%d", &n);  
  6.     b=n/100;  
  7.     s=n/10%10;  
  8.     g=n%10;  
  9.     sum=b*b*b+s*s*s+g*g*g;  
  10.     if(sum==n)  
  11.         printf("Yes/n");  
  12.     else  
  13.         printf("No/n");  
  14. }  

运行结果(Redhat Linux):

================================================

求4位数的水仙花数(1000<=X<=9999)

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     int i,j,k,l,m,n;  
  5.     for(i=1; i<=9; i++)  
  6.         for(j=0; j<=9; j++)  
  7.             for(k=0; k<=9; k++)  
  8.                 for(l=0; l<=9; l++)  
  9.                     if((i*1000+j*100+k*10+l)==i*i*i*i+j*j*j*j+k*k*k*k+l*l*l*l)  
  10.                         printf("%d%d%d%d=%d^4+%d^4+%d^4*%d^4/n", i, j, k, l, i, j, k, l);  
  11.     return 0;  
  12. }  

运行结果:

================================================

思考:如果求得高精度大数的水仙花数,如8位、18位、28位的水仙花数(需考虑计算机精度,可采用数组或指针实现,大数计算)

==========================================================

10、 大数计算

大数运算:参加的值和计算结果通常是以上百位数,上千位数以及更大长度之间的整数运算,早已超出了计算机能够表示数值的精度范围(2^32=4294967296或2^64=18446744073709551616)即64位机最大也才20位,因此需要想出其它的办法计算大数。

 

求任意两整数之和(1000位以内)

测试环境:VC 6.0 (C)

[cpp] view plain copy
 print?
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #define MAX 1000 /* precision */  
  4. void input(char ch[])  
  5. {  
  6.     scanf("%s", ch);  
  7. }  
  8. void add(char ch1[], char ch2[], char ch3[])  
  9. {  
  10.     int len1, len2, len3, maxlen;  
  11.     int sum, flag;  
  12.     len1=strlen(ch1);  
  13.     len2=strlen(ch2);  
  14.     len3=maxlen=len1 >= len2 ? len1 : len2;  
  15.     flag=0; /* jin wei */  
  16.       
  17.     while(len1>=1 && len2>=1)  
  18.     {  
  19.         sum=ch1[len1-1]-'0' + ch2[len2-1]-'0' + flag; /* char -> int to calculate sum */  
  20.         flag=0;  
  21.           
  22.         if(sum>=10)  
  23.         {  
  24.             sum-=10;  
  25.             flag=1;  
  26.         }  
  27.         ch3[maxlen-1]=sum + '0';  
  28.         len1--;  
  29.         len2--;  
  30.         maxlen--;  
  31.     }  
  32.     while(len1>=1) /* if num1[] is longer or maxer */  
  33.     {  
  34.         sum=ch1[len1-1]-'0' + flag;  
  35.         flag=0;  
  36.           
  37.         if(sum>=10)  
  38.         {  
  39.             sum-=10;  
  40.             flag=1;  
  41.         }  
  42.         ch3[maxlen-1]=sum + '0';  
  43.         len1--;  
  44.         maxlen--;  
  45.     }  
  46.       
  47.     while(len2>=1) /* if num2[] is longer or maxer */  
  48.     {  
  49.         sum=ch2[len2-1]-'0' + flag;  
  50.         flag=0;  
  51.           
  52.         if(sum>=10)  
  53.         {  
  54.             sum-=10;  
  55.             flag=1;  
  56.         }  
  57.         ch3[maxlen-1]=sum + '0';  
  58.         len2--;  
  59.         maxlen--;  
  60.     }  
  61.     if(flag != 0) /* if flag, then print gaowei(jinwei) */  
  62.         printf("%d", flag);  
  63.     for(int i=0; i<len3; i++)   
  64.         printf("%c", ch3[i]);     
  65.     printf("/n");  
  66. }  
  67. int main()  
  68. {  
  69.     char ch1[MAX], ch2[MAX], ch3[MAX+1];  
  70.     memset(ch3, '0'sizeof(ch3));  
  71.     input(ch1);  
  72.     input(ch2);  
  73.     add(ch1, ch2, ch3);  
  74.     return 0;  
  75. }  

运行结果:

    

思考:请大家自己设计实现更复杂的大数减法、乘法、除法,求余、求幂、求最小公倍数等大数运算(提示:可用数组或链表)

==========================================================


参考推荐:

学习算法之路

各种基本算法实现小结(一)—— 链 表

各种基本算法实现小结(二)—— 堆 栈

各种基本算法实现小结(三)—— 树与二叉树

各种基本算法实现小结(四)—— 图及其遍历

各种基本算法实现小结(五)—— 排序算法

各种基本算法实现小结(六)—— 查找算法

各种基本算法实现小结(七)—— 常用算法


12个有趣的C语言面试题

作者原文地址:http://blog.csdn.net/sunboy_2050/article/details/5645837

0 0
原创粉丝点击