幾個比較妙的算法

  1. 計算32位整數二進制表示中含有1的個數:
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. static int count1s(int /*32位整型數*/);
  5. int main(void)
  6. {
  7.     int data;
  8.     int count;
  9.     
  10.     printf("請輸入整型數:");
  11.     scanf("%d", &data);
  12.     
  13.     count = count1s(data);
  14.     
  15.     printf("1的位數爲:%d/n", count);
  16.     
  17.     return 0;
  18. }
  19. static int count1s(int data)
  20. {
  21.     int count = 0;
  22.     
  23.     while (data) 
  24.     { 
  25.         data = data & (data-1); 
  26.         count++; 
  27.     }
  28.     
  29.     return count;
  30. }
  31. /**
  32. * @acm中一道比較簡單的題目:一個正整型數組,各個元素互不相等,且每個元素都小    99,求某個元素是另外一個元素的兩倍這樣的對數有多少?
  33. */
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #define MAX_INTEGER 99
  38. int main(void)
  39. {
  40.     int data_list[15+1];   /* data */
  41.     int data_appear[MAX_INTEGER];  /* indicate whether the data appear */
  42.     int count[100];   /* log the count */
  43.     int list_index = 0;
  44.     int i, j;
  45.     
  46.     
  47.     memset(data_list, 0, sizeof(data_list));  /* reset */
  48.     memset(data_appear, 0, sizeof(data_appear));
  49.     memset(count, 0, sizeof(count));
  50.     data_list[0] = 1;   /* make it not -1 */
  51.     while (1) 
  52.     {
  53.         for (i=0; i<16; ++i)
  54.         {
  55.             scanf("%d", &data_list[i]);
  56.             if (data_list[i] != 0 && data_list[i] > 0)
  57.             {
  58.                 data_appear[data_list[i]] = 1;
  59.             }
  60.             else
  61.             {
  62.                 break;
  63.             }
  64.         }
  65.         if (data_list[0] == EOF)   /* EOF is -1 */
  66.             break;
  67.         
  68.         for (j=0; j<i; ++j)
  69.         {
  70.             if (data_list[j]%2 != 0)
  71.                 continue;
  72.             if (data_appear[data_list[j]/2] == 1)  /* fit */
  73.                 ++count[list_index];  
  74.         }
  75.         ++list_index;
  76.         
  77.         memset(data_list, 0, sizeof(data_list));     /* reset */
  78.         memset(data_appear, 0, sizeof(data_appear)); /* reset */
  79.     }
  80.     
  81.     for (i=0; i<list_index; ++i)
  82.     {
  83.         printf("%d/n", count[i]);
  84.     }
  85.     
  86.     return 0;
  87. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章