免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: loveguohuasai
打印 上一主题 下一主题

[算法] 母牛数量算法 [复制链接]

论坛徽章:
0
191 [报告]
发表于 2006-06-20 17:05 |只看该作者
强阿
好算法

论坛徽章:
0
192 [报告]
发表于 2006-06-23 07:58 |只看该作者
年数N

2的(N/4)次方

每次生3头母牛的,就是3的(N/4)次方。

论坛徽章:
0
193 [报告]
发表于 2006-06-23 08:00 |只看该作者
只有在N/4=整数的时候母牛才会生小牛,题目没有给出母牛早产或难产

论坛徽章:
0
194 [报告]
发表于 2006-06-24 21:35 |只看该作者

偶的算法: 是个等比是列吧 我觉得

用数学等比数列算,我的答案year=100,cow=33554432
#include<iostream.h>
int js(int);
int main()
{int cow,year;
cout<<"Input  year:";
cin>>year;
if (year>3&&year<12
{year=year-year%4;   //4年生一次,超过4年N倍按4年N倍算
cow=js(year);
cout<<"cow="<<cow;
return 0;
}
else if(year<1)
        cout<<"input is wrong";
else if(year<4&&year>0)
        cout<<"cow is:1";
else cout<<"input year is too big";
}
int js(int n)   //计算生的牛
{int i,b,c;
b=(n/4)+1;
c=1;   
/*这是等比数列吧,1,2,4,8…………用公式a(n)=a(0)*q的(n-1)次方  q:公比 ,a(0):首项  */
for(i=1;i<b;++i) //算q的N-1次方
    { c=2*c;
      }
return c;
}

[ 本帖最后由 czx1124 于 2006-6-24 21:41 编辑 ]

论坛徽章:
0
195 [报告]
发表于 2006-06-30 12:29 |只看该作者
原帖由 czx1124 于 2006-6-24 21:35 发表
用数学等比数列算,我的答案year=100,cow=33554432
#include<iostream.h>
int js(int);
int main()
{int cow,year;
cout<<"Input  year:";
cin>>year;
if (year>3&&am ...



我用计算器计算的结果也是33554432,不会写程序啊,HOHO~

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
196 [报告]
发表于 2006-07-05 15:50 |只看该作者
不需要那么麻烦吧,就是一个简单的命题:
每4年,母牛数量翻番,计算n年后有多少母牛。


  1. // 就是计算 2^(n/4)
复制代码

论坛徽章:
0
197 [报告]
发表于 2006-08-19 22:35 |只看该作者

非递归算法

int _calc(n)
{
        int a[4]={1,0,0,0};
        int i,sum=0,tmp;
        for(i=1; i<n; i++){
                a[3]=a[2]+a[3];
                tmp=a[0];
                a[0]=a[3];
                a[2]=a[1];
                a[1]=tmp;
               
        }
        sum=a[0]+a[1]+a[2]+a[3];
        return sum;
}

int main()
{
        int n=30;
        printf("%d\n",_calc(n));
        return 0;
}

论坛徽章:
0
198 [报告]
发表于 2006-09-07 15:32 |只看该作者
贴一个我的答案阿:
呵呵!应该比较节省资源哦!
我没有用递归的方法,我是针对这组数据的特点进行计算的。
#include<stdio.h>
   int fun(int n)
       {
         int i,sum,tmp;     / sum 最后的结果 , i , tmp  中间量
         sum=n-3;           /  第一只牛第四年才可以每年生小牛
         tmp=0;         
         if(n<=3)             / 如果计算的年限小于等于3年
            sum+=0;
         else                   / 计算的年限大于3年
         {
         for(i=1;i<=sum-3;i++)       /所有的奶牛都要第四年生小牛, 所以sum-3 。
                                 /不同年头出生的牛,他们依次生出的牛的数目递减 如10年,4 ,3 , 2 , 1
            {
               tmp+=i;
             }
          }
         sum+=tmp;                     /计算最后的总结果
         return sum;

       }

   int main()
       {
          int n;
          printf("Please Input the n:\n");    / 提示输入计算的年数
          scanf("%d",&n);
          printf("The Result Is :%d\n",fun(n));

        }
是不是资源消耗很小阿!

论坛徽章:
0
199 [报告]
发表于 2006-09-07 16:31 |只看该作者
o的递归的,估计用ULONG,也会溢出。


  1. typedef unsigned long ULONG;

  2. ULONG get_cow_num(int year);
  3. ULONG f(int year);

  4. void main()
  5. {
  6.         cout << get_cow_num(100) << endl;
  7. }

  8. ULONG get_cow_num(int year)
  9. {
  10.         ULONG sum = 0;
  11.         for( int i = 1; i <= year; ++i )
  12.                 sum += f(i);

  13.         return sum;
  14. }

  15. ULONG f(int year)
  16. {
  17.         ULONG ret = 0;

  18.         switch(year)
  19.         {
  20.         case 1:
  21.                 ret = 1;
  22.                 break;
  23.         case 2:
  24.         case 3:
  25.                                 ret = 0;
  26.                                 break;
  27.         case 4:
  28.                 ret = 1;
  29.                 break;
  30.         default:
  31.                 for( int k = 1; k <= year - 4; ++k )
  32.                 {
  33.                         ret += f(k);
  34.                 }
  35.         }

  36.         return ret;
  37. }
复制代码

[ 本帖最后由 dzbjet 于 2006-9-7 16:35 编辑 ]

论坛徽章:
0
200 [报告]
发表于 2006-09-07 16:49 |只看该作者
改善后的:用了一个全局数组,存储计算过的f[year],消除递归。
不知道对不对,大家指正:


  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <functional>
  5. #include <string>
  6. #include <iterator>
  7. #include <map>
  8. #include <vector>

  9. #include <time.h>

  10. using namespace std;

  11. typedef double ULONG;

  12. ULONG get_cow_num(int year);
  13. ULONG f(int year);

  14. ULONG ff[101] = { 0 };

  15. void main()
  16. {
  17.         memset(ff, 0, sizeof(ff));
  18.        
  19.         printf("%.f\n", get_cow_num(100));// << endl;

  20. }

  21. ULONG get_cow_num(int year)
  22. {
  23.         ULONG sum = 0;
  24.         for( int i = 1; i <= year; ++i )
  25.         {
  26.                 ULONG temp = f(i);
  27.                 sum += temp;
  28.                 printf("f(%d) = %.f, finished!   sum[%d] = %.f\n", i, temp, i, sum);
  29.         }

  30.         return sum;
  31. }

  32. ULONG f(int year)
  33. {
  34.         if( ff[year] ) return ff[year];

  35.         ULONG ret = 0;

  36.         ULONG temp = 0;

  37.         switch(year)
  38.         {
  39.         case 1:
  40.                 ret = 1;
  41.                 break;
  42.         case 2:
  43.         case 3:
  44.                 ret = 0;
  45.                 break;
  46.         case 4:
  47.                 ret = 1;
  48.                 break;
  49.         default:
  50.                 for( int k = 1; k <= year - 3; ++k )
  51.                 {
  52.                         // ret += f(k), 不需要了
  53.                         ret += ff[k];
  54.                 }
  55.         }

  56.         ff[year] = ret;

  57.         return ret;
  58. }
复制代码

输出:

  1. f(1) = 1, finished!   sum[1] = 1
  2. f(2) = 0, finished!   sum[2] = 1
  3. f(3) = 0, finished!   sum[3] = 1
  4. f(4) = 1, finished!   sum[4] = 2
  5. f(5) = 1, finished!   sum[5] = 3
  6. f(6) = 1, finished!   sum[6] = 4
  7. f(7) = 2, finished!   sum[7] = 6
  8. f(8) = 3, finished!   sum[8] = 9
  9. f(9) = 4, finished!   sum[9] = 13
  10. f(10) = 6, finished!   sum[10] = 19
  11. f(11) = 9, finished!   sum[11] = 28
  12. f(12) = 13, finished!   sum[12] = 41
  13. f(13) = 19, finished!   sum[13] = 60
  14. f(14) = 28, finished!   sum[14] = 88
  15. f(15) = 41, finished!   sum[15] = 129
  16. f(16) = 60, finished!   sum[16] = 189
  17. f(17) = 88, finished!   sum[17] = 277
  18. f(18) = 129, finished!   sum[18] = 406
  19. f(19) = 189, finished!   sum[19] = 595
  20. f(20) = 277, finished!   sum[20] = 872
  21. f(21) = 406, finished!   sum[21] = 1278
  22. f(22) = 595, finished!   sum[22] = 1873
  23. f(23) = 872, finished!   sum[23] = 2745
  24. f(24) = 1278, finished!   sum[24] = 4023
  25. f(25) = 1873, finished!   sum[25] = 5896
  26. f(26) = 2745, finished!   sum[26] = 8641
  27. f(27) = 4023, finished!   sum[27] = 12664
  28. f(28) = 5896, finished!   sum[28] = 18560
  29. f(29) = 8641, finished!   sum[29] = 27201
  30. f(30) = 12664, finished!   sum[30] = 39865
  31. f(31) = 18560, finished!   sum[31] = 58425
  32. f(32) = 27201, finished!   sum[32] = 85626
  33. f(33) = 39865, finished!   sum[33] = 125491
  34. f(34) = 58425, finished!   sum[34] = 183916
  35. f(35) = 85626, finished!   sum[35] = 269542
  36. f(36) = 125491, finished!   sum[36] = 395033
  37. f(37) = 183916, finished!   sum[37] = 578949
  38. f(38) = 269542, finished!   sum[38] = 848491
  39. f(39) = 395033, finished!   sum[39] = 1243524
  40. f(40) = 578949, finished!   sum[40] = 1822473
  41. f(41) = 848491, finished!   sum[41] = 2670964
  42. f(42) = 1243524, finished!   sum[42] = 3914488
  43. f(43) = 1822473, finished!   sum[43] = 5736961
  44. f(44) = 2670964, finished!   sum[44] = 8407925
  45. f(45) = 3914488, finished!   sum[45] = 12322413
  46. f(46) = 5736961, finished!   sum[46] = 18059374
  47. f(47) = 8407925, finished!   sum[47] = 26467299
  48. f(48) = 12322413, finished!   sum[48] = 38789712
  49. f(49) = 18059374, finished!   sum[49] = 56849086
  50. f(50) = 26467299, finished!   sum[50] = 83316385
  51. f(51) = 38789712, finished!   sum[51] = 122106097
  52. f(52) = 56849086, finished!   sum[52] = 178955183
  53. f(53) = 83316385, finished!   sum[53] = 262271568
  54. f(54) = 122106097, finished!   sum[54] = 384377665
  55. f(55) = 178955183, finished!   sum[55] = 563332848
  56. f(56) = 262271568, finished!   sum[56] = 825604416
  57. f(57) = 384377665, finished!   sum[57] = 1209982081
  58. f(58) = 563332848, finished!   sum[58] = 1773314929
  59. f(59) = 825604416, finished!   sum[59] = 2598919345
  60. f(60) = 1209982081, finished!   sum[60] = 3808901426
  61. f(61) = 1773314929, finished!   sum[61] = 5582216355
  62. f(62) = 2598919345, finished!   sum[62] = 8181135700
  63. f(63) = 3808901426, finished!   sum[63] = 11990037126
  64. f(64) = 5582216355, finished!   sum[64] = 17572253481
  65. f(65) = 8181135700, finished!   sum[65] = 25753389181
  66. f(66) = 11990037126, finished!   sum[66] = 37743426307
  67. f(67) = 17572253481, finished!   sum[67] = 55315679788
  68. f(68) = 25753389181, finished!   sum[68] = 81069068969
  69. f(69) = 37743426307, finished!   sum[69] = 118812495276
  70. f(70) = 55315679788, finished!   sum[70] = 174128175064
  71. f(71) = 81069068969, finished!   sum[71] = 255197244033
  72. f(72) = 118812495276, finished!   sum[72] = 374009739309
  73. f(73) = 174128175064, finished!   sum[73] = 548137914373
  74. f(74) = 255197244033, finished!   sum[74] = 803335158406
  75. f(75) = 374009739309, finished!   sum[75] = 1177344897715
  76. f(76) = 548137914373, finished!   sum[76] = 1725482812088
  77. f(77) = 803335158406, finished!   sum[77] = 2528817970494
  78. f(78) = 1177344897715, finished!   sum[78] = 3706162868209
  79. f(79) = 1725482812088, finished!   sum[79] = 5431645680297
  80. f(80) = 2528817970494, finished!   sum[80] = 7960463650791
  81. f(81) = 3706162868209, finished!   sum[81] = 11666626519000
  82. f(82) = 5431645680297, finished!   sum[82] = 17098272199297
  83. f(83) = 7960463650791, finished!   sum[83] = 25058735850088
  84. f(84) = 11666626519000, finished!   sum[84] = 36725362369088
  85. f(85) = 17098272199297, finished!   sum[85] = 53823634568385
  86. f(86) = 25058735850088, finished!   sum[86] = 78882370418473
  87. f(87) = 36725362369088, finished!   sum[87] = 115607732787561
  88. f(88) = 53823634568385, finished!   sum[88] = 169431367355946
  89. f(89) = 78882370418473, finished!   sum[89] = 248313737774419
  90. f(90) = 115607732787561, finished!   sum[90] = 363921470561980
  91. f(91) = 169431367355946, finished!   sum[91] = 533352837917926
  92. f(92) = 248313737774419, finished!   sum[92] = 781666575692345
  93. f(93) = 363921470561980, finished!   sum[93] = 1145588046254325
  94. f(94) = 533352837917926, finished!   sum[94] = 1678940884172251
  95. f(95) = 781666575692345, finished!   sum[95] = 2460607459864596
  96. f(96) = 1145588046254325, finished!   sum[96] = 3606195506118921
  97. f(97) = 1678940884172251, finished!   sum[97] = 5285136390291172
  98. f(98) = 2460607459864596, finished!   sum[98] = 7745743850155768
  99. f(99) = 3606195506118921, finished!   sum[99] = 11351939356274688
  100. f(100) = 5285136390291172, finished!   sum[100] = 16637075746565860
  101. 16637075746565860
  102. Press any key to continue
复制代码

[ 本帖最后由 dzbjet 于 2006-9-7 17:16 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP