代码错误,请教修改
TooY0ung的数学难题
**描述
TooY0ung给定四个无符号32位整数a,b,c,d,求A=a+b×2^32+c×2^64+d×2^96
是否是4的幂次。
注:若一个数是4的幂次,则存在一个整数n使得4^n=A。
输入
输入有多组数据,每组数据有四个无符号32位整数a,b,c,d.
输出
每组数据输出一行,若a+b×2^32+c×2^64+d×2^96
是4的幂次,输出"Yes",否则输出"No"(不含双引号)
输入样例 1
4 0 0 0
1 2 3 4
0 0 0 1
输出样例 1
Yes
No
Yes
提示
无符号32位整数(unsigned int)范围是[0,2^32-1]
数据范围:
对于20%的数据,输入只包含一组数据。
对于额外的20%数据,输入只包含三组数据。
对于额外的60%的数据,输入数据组数不限。
给个提示:
关于如何进行多组数据输入:
while(cin>>a>>b>>c>>d)即可
如下是本人代码
#include<bits/stdc++.h>
using namespace std;
bool simi(int n){
if(n>=1&&(n&(n-1))==0)cout<<"Yes";
else cout<<"No";
}
int main(){
int a,b,c,d,z;
while(cin>>a>>b>>c>>d){
z=a+b*pow(2,32)+c*pow(2,64)+d*pow(2,96);
simi(z);
}
return 0;
}
多多指导谢谢!
输出结果看看
用二进制方式计算,可以用长度128位的数组表示
4的n次幂就是2的2n次幂,结果二进制就是最高位为1后面跟偶数位0
#include <iostream>
using namespace std;
void swap(int* arr) { if (arr[0] < arr[1]) { int t = arr[0]; arr[0] = arr[1]; arr[1] = t; }}
void insert(int * arr, int n) { if (n > arr[0]) { arr[1] = arr[0]; arr[0] = n; } else if (n > arr[1]) { arr[1] = n; } }
int main()
{
int n;
cin >> n;
int cntodd = 0;
int cnteven = 0;
int odd[2];
int even[2];
for (int i = 0; i < n; i++)
{
int curr;
cin >> curr;
if (curr % 2 == 1)
{
if (cntodd == 0)
{
odd[0] = curr;
cntodd++;
}
else if (cntodd == 1)
{
odd[1] = curr;
cntodd++;
swap(odd);
}
else
{
insert(odd, curr);
}
}
else
{
if (cnteven == 0)
{
even[0] = curr;
cnteven++;
}
else if (cnteven == 1)
{
even[1] = curr;
cnteven++;
swap(even);
}
else
{
insert(even, curr);
}
}
}
if (cnteven < 2 && cnteven < 2)
cout << -1;
else if (cnteven < 2)
cout << odd[0] + odd[1];
else if (cntodd < 2)
cout << even[0] + even[1];
else
cout << (odd[0] + odd[1] > even[0] + even[1] ? odd[0] + odd[1] : even[0] + even[1]);
return 0;
}
看看这个是否超时