鱼C论坛

 找回密码
 立即注册
查看: 1963|回复: 2

[技术交流] 633_平方数之和

[复制链接]
发表于 2019-7-2 14:40:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. /*
  2. 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。

  3. 示例1:

  4. 输入: 5
  5. 输出: True
  6. 解释: 1 * 1 + 2 * 2 = 5
  7. 示例2:
  8. 输入: 3
  9. 输出: False
  10. */
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-2 14:41:12 | 显示全部楼层
  1. bool isSquare(int c)
  2. {
  3.     bool ret_val = false;
  4.     int temp = 0;
  5.     do
  6.     {
  7.         if( c < 0 )
  8.         {
  9.             ret_val = false;
  10.             break;
  11.         }
  12.         
  13.         if(  ( c == 0 )
  14.            ||( c == 1 )
  15.         )
  16.         {
  17.             ret_val = true;
  18.             break;
  19.         }
  20.         temp = (int)(sqrtf(c));
  21.         if(c == temp*temp )
  22.         {
  23.             ret_val = true;
  24.         }
  25.         else
  26.         {
  27.             ret_val = false;   
  28.         }
  29.         break;
  30.     }while(0);
  31.    
  32.     return ret_val;
  33. }

  34. /*方法1:常规遍历法*/
  35. bool judgeSquareSum(int c)
  36. {
  37.    
  38.     bool ret_val = false    ;
  39.     int  i       = 0        ;
  40.     int  temp    = 0        ;
  41.    
  42.     do
  43.     {
  44.         if(c<0)
  45.         {
  46.             ret_val = false;
  47.             break;
  48.         }
  49.         
  50.         if(  (c==0)
  51.            ||(c==1)
  52.         )
  53.         {
  54.             ret_val = true;
  55.             break;
  56.         }
  57.         
  58.         while(  (temp    >= 0     )
  59.               &&(ret_val == false )
  60.               &&(i       <  46341 ) /*防止平方溢出*/
  61.         )
  62.         {
  63.             temp = c - i*i;
  64.             ret_val = isSquare(temp);
  65.             i++;
  66.         }
  67.         break;
  68.     }while(0);
  69.     return ret_val;
  70. }

  71. /*
  72. 执行用时 :12 ms, 在所有 C 提交中击败了26.58%的用户
  73. 内存消耗 :6.8 MB, 在所有 C 提交中击败了69.70%的用户
  74. */
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-2 15:07:23 | 显示全部楼层
  1. /*方法2:上下限逼近法*/
  2. bool judgeSquareSum(int c)
  3. {
  4.     bool ret_val = false;
  5.     int  left    = 0;
  6.     int  right   = (int)(sqrtf(c));
  7.    
  8.     do
  9.     {
  10.         if(c<0)
  11.         {
  12.             ret_val = false;
  13.             break;
  14.         }
  15.         else if(c<3)
  16.         {
  17.             ret_val = true;
  18.             break;
  19.         }
  20.         else
  21.         {
  22.             while(  (left    <= right)
  23.                   &&(ret_val == false)
  24.             )
  25.             {
  26.                 if(left*left > c - right*right ) /*这里不要用 x*x + y*y = z ,防止左边相加溢出*/
  27.                 {
  28.                     right --;
  29.                 }
  30.                 else if(left*left  == c - right*right)
  31.                 {
  32.                     ret_val = true;
  33.                 }
  34.                 else
  35.                 {
  36.                     left++;
  37.                 }
  38.             }
  39.         }
  40.     }while(0);
  41.     return ret_val;
  42. }

  43. /*
  44. 执行用时 :4 ms, 在所有 C 提交中击败了96.20%的用户
  45. 内存消耗 :6.9 MB, 在所有 C 提交中击败了69.70%的用户
  46. */
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表