第三届山西省程序设计大赛:一道大水题

第三届山西省程序设计大赛

一道大水题
时间限制: C/C++ 2000ms; Java 4000ms 内存限制: 65535K

问题描述

    Dr. Pan作为上兰帝国ACM的总负责人,对队员的队员的训练也是日常关心,他要求每周要有一位队员出一道题目。不知过了多少年,终于轮到Shiyiliang出题了,他费尽脑汁,终于出了一道大水题
    给定一个偶数n,n的取值范围为[-1e18,1e18],要求一对整数x,y满足以下条件:
 1.x*y==n
 2.x与n必须同号,即如果n>0则x>0,n<0则x<0
 3.x必须为偶数,y必须为奇数
 4.y的取值范围为(-1e18,1e18)
 5.使x的值尽可能小的情况下,y的值尽可能大
 为了减轻队员的工作量,Dr. pan决定只要求输出y即可.
 输入描述
 第一行一个T(T<=100000)代表样例数。
 接下来T行,每行一个数字代表题目中的n(-1e18<=n<=1e18,保证n为偶数)。
 输出描述
 输出T行。
 每行一个数字代表题目中的y,该数字必须为奇数。
 样例输入
 1
 12
 样例输出
 3

这道题当时没有过一直没有处理好,n==0的时候,此时y应该时最大的奇数才对!!!!!但是没有想到,一直一位y取不了什么值!!!!结束挺大佬说了,简直emmmmmmmmmm,我还太菜了。
这是后来修改后的代码,还没有提交看看,不过改了那个坑应该没啥问题了

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll ans=1e18;
int main()
{
      int T;
      ll n;
      scanf("%d",&T);
      while(T--)
      {
         scanf("%lld",&n);
         if(n>0)
         {
           while(true)
          {
            if((n/2)&1)
            {
             printf("%lld\n",(n/2));
             break ;
            }
            else
            n=n/2; 
          }
         }
         else
         {
             //if(n==0)
             //printf("\n");
             if(n==0)
             printf("%lld\n",ans-1); 
             else
             printf("1\n");
             continue;      
         }
      }
    //system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Miranda_ymz/article/details/80215043