P7071 [CSP-J2020] 优秀的拆分
记录29
#include <bits/stdc++.h>
using namespace std;
int main(){int n,a[35]={};cin>>n;if(n%2==1){cout<<"-1";return 0;}int cnt=0;while(n!=0){if(n%2==1) a[cnt]=1;cnt++;n/=2;}for(int i=cnt-1;i>=0;i--){if(a[i]==1) cout<<fixed<<setprecision(0)<<pow(2,i)<<" ";}return 0;
}突破点
对于正整数 n 的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,n 被分解为了若干个不同的 2 的正整数次幂。注意,一个数 x 能被表示成 2 的正整数次幂,当且仅当 x 能通过正整数个 2 相乘在一起得到。👉一个数拆成不同2的次方之和
从大到小输出这个拆分中的每一个数,若不存在优秀的拆分,输出
-1👉偶数由大到小输出拆出来的数,奇数输出-1
思路
- 奇数输出-1
- 偶数拆成2的次方形式👉转换成二进制
- 由大到小输出拆出来的数
代码简析
#include <bits/stdc++.h>
using namespace std;
int main(){int n,a[35]={};cin>>n;if(n%2==1){cout<<"-1";return 0;}...return 0;
}n为输入数
a[35]是用来保存2进制的数组
if条件判断是奇数直接输出-1
注:int类型32位
#include <bits/stdc++.h>
using namespace std;
int main(){int n,a[35]={};cin>>n;if(n%2==1){...}int cnt=0;while(n!=0){if(n%2==1) a[cnt]=1;cnt++;n/=2;}...return 0;
}cnt代表填进去的序号
循环有点类似数位分离,每次分离出2的进位
a数组来存储每一位
#include <bits/stdc++.h>
using namespace std;
int main(){int n,a[35]={};cin>>n;if(n%2==1){cout<<"-1";return 0;}int cnt=0;while(n!=0){if(n%2==1) a[cnt]=1;cnt++;n/=2;}for(int i=cnt-1;i>=0;i--){if(a[i]==1) cout<<fixed<<setprecision(0)<<pow(2,i)<<" ";}return 0;
}for循环输出每一位
pow()函数结果非常大或者非常小会输出科学计数法
cout<<fixed<<setprecision(0)设置小数点后的精度为0,即不显示小数部分。
补充
在C++中,
pow函数用于计算一个数的幂,其返回值类型为double。当计算结果非常大或非常小时,pow函数的输出可能会以科学计数法(带e)的形式显示。例如,pow(10, 9)的结果是1e+09,而不是1000000000。为了避免这种情况,可以使用以下方法将结果格式化为普通数字形式。
1. 使用
std::fixed和std::setprecision
std::fixed和std::setprecision是 C++ 标准库中的 I/O 操纵符,用于控制浮点数的输出格式。语法
#include <iomanip> // 包含 std::fixed 和 std::setprecision
std::fixed:设置浮点数为固定小数点表示法。
std::setprecision(n):设置浮点数的小数点后保留的位数为n。2. 示例代码
示例1:避免科学计数法
#include <iostream> #include <cmath> #include <iomanip> // 包含 std::fixed 和 std::setprecision using namespace std;int main() {double result = pow(10, 9); // 计算 10 的 9 次幂cout << fixed << setprecision(0) << result << endl; // 设置为固定小数点表示法,小数点后保留 0 位return 0; }输出结果
10000000003. 详细解释
3.1
std::fixed
作用:设置浮点数为固定小数点表示法,而不是科学计数法。
用法:在输出流中使用
std::fixed,例如cout << fixed << value;。3.2
std::setprecision(n)
作用:设置浮点数的小数点后保留的位数为
n。
用法:在输出流中使用
std::setprecision(n),例如cout << setprecision(0) << value;。4. 注意事项
4.1 精度问题
setprecision(0):设置小数点后保留 0 位,适用于整数结果。
setprecision(n):设置小数点后保留n位,适用于浮点数结果。4.2 临时设置
std::fixed和std::setprecision的设置是临时的,只影响当前输出流。如果需要多次使用,可以在每次输出前重新设置。5. 总结
问题:
pow函数的输出可能会以科学计数法(带e)的形式显示。
解决方案:使用
std::fixed和std::setprecision控制浮点数的输出格式。
示例:
cout << fixed << setprecision(0) << pow(10, 9) << endl;
作用:
std::fixed:设置为固定小数点表示法。
std::setprecision(n):设置小数点后保留的位数为n。
