丑数 按照顺序被2,3,5 (质数)整除后排序

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int foo( int n ) {
  6. static int *arr = NULL;
  7. static size_t arr_sz = 0;
  8. int i2, i3, i5, ic;
  9. if ( n <= arr_sz ) {
  10. return arr[ n-1 ];
  11. } else {
  12. int *arr_new = (int *) realloc( arr, n*sizeof(int) );
  13. memset( arr_new + arr_sz, 0, (n-arr_sz)*sizeof(int) );
  14. arr = arr_new;
  15. arr_sz = n;
  16. }
  17. arr[0] = 1;
  18. for ( i2=i3=i5=0, ic=1; ic<n; ) {
  19. int p2=arr[i2]*2, p3=arr[i3]*3, p5=arr[i5]*5, p;
  20. p = p2 < p3 ? p2 : p3;
  21. p = p < p5 ? p : p5;
  22. if ( p == p2 ) i2++;
  23. if ( p == p3 ) i3++;
  24. if ( p == p5 ) i5++;
  25. arr[ ic++ ] = p;
  26. }
  27. return arr[ n-1 ];
  28. }
  29.  
  30. int main()
  31. {
  32. int n;
  33. while ( scanf( "%d", &n ) == 1 && n > 0 )
  34. printf( "arr(%d) = %d\n", n, foo( n ) );
  35. return 0;
  36. }
  37.  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值