鱼C论坛

 找回密码
 立即注册
查看: 1180|回复: 1

[已解决]检测一个数是否为两数平方和 c++ timeout

[复制链接]
发表于 2020-1-22 07:22:07 | 显示全部楼层 |阅读模式

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

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

x
检查一个数是否为两数平方之和 总是timeout 有什么更节省时间的写法吗?谢谢谢谢!(这里0是两数平方和)
//return 最大的整数d,满足d*d<=n
unsigned int integer_sqrt(unsigned int x){
   unsigned int d = sqrt(x);
   while((d+1)*(d+1) <= x){
      ++d;}
   while (d*d > x){
      --d;}
   return d;}

int main(){
   int n;
   cin >> n;
   int is_sum=0;
   int i=0;
   int j=0;
   bool found=false;

   if(n==0){
      is_sum=1;
   }
   else{
      while(i<=n && !found){
         j=sqrt(n-i*i);
         if(i*i+j*j=n && j!=0){
            is_sum=1;
         found=true;
         }
   }
   if (is_sum==1){cout << "sum of squares" <<endl;}
   else{cout <<"not sum of squares" <<endl;}
   return 0;
}





最佳答案
2020-1-22 15:20:51
提供几个优化思路:
1、循环时i的值只需要到sqrt(n),不需要到n
2、考虑到奇数的平方只可能是4n+1的形式,偶数的平方只可能是4n的形式。
     那么一个数:
                     如果除以4余0,那么它只可能是两个偶数的平方和
                     如果除以4余1,那么它只可能是一个奇数一个偶数的平方和
                     如果除以4余2,那么它只可能是两个偶数的平方和
                     如果除以4余3,那么它不可能是两个数的平法和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-22 15:20:51 | 显示全部楼层    本楼为最佳答案   
提供几个优化思路:
1、循环时i的值只需要到sqrt(n),不需要到n
2、考虑到奇数的平方只可能是4n+1的形式,偶数的平方只可能是4n的形式。
     那么一个数:
                     如果除以4余0,那么它只可能是两个偶数的平方和
                     如果除以4余1,那么它只可能是一个奇数一个偶数的平方和
                     如果除以4余2,那么它只可能是两个偶数的平方和
                     如果除以4余3,那么它不可能是两个数的平法和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 12:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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