循环
c++如何实现格式化输出
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int no=0,yes=0,yes_count=0;
int n,k;
cin>>n>>k;
int i=1;
int a;
while(i<=n)
{
if((1.0)*i/k==i/k)
{
yes_count++;
yes+=i;
}
else
no+=i;
i++;
}
cout<<setiosflags(ios::fixed)<<setprecision(1)<<(1.0)*yes/yes_count<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<(1.0)*no/(n-yes_count);
return 0;
}
1.输出空格用" "(中间加一个空格)
2.输出格式加在setiosflags()的括号内
3.ios::fixed实现浮点数以确定小数位数输出
4.调用cout的成员函数/作用相同的流操纵算子
precision setprecision(n)设置输出浮点数的精度为n
width setw(w)指定输出宽度为w个字符
setfill(c)指定以c字符填充不足的位数
高精度运算(阶乘之和)
出错点:
- 加法的surplus最多两位数,push_back的时候只许求模/整除一次即可
- 高精度乘法时的surplus可能有好几位数,只求模/整除一次,有可能不够,导致过大的surplus保存在vector的一位int中,随着n的增大,雪球越滚越大,最终溢出,导致最终的结果出现负数
- vector
a中的a是常指针 - 函数体传参时,注意使用地址传递,如果时拷贝传递,无法改变实际的值
- 注意过程中的溢出问题
DEBUG心得:
- 学会使用断点,跳过
不足之处:
- 使用了vector实现可变长度的“数组”,使用push_back()随时添加“数组”元素,但是带来了长度比较的麻烦
- 但是如果已知输入n的范围,可以直接定义(略大的)定长的数组,方便对齐,不需要长度比较
- 可以尝试使用c++的运算符重载
- 可以尝试实现高精度除法和高精度减法
#include <iostream>
#include <vector>
using namespace std;
void multiply(vector<int>*a,int b);
void add(vector<int> *a, vector<int>b);
void printV(vector<int>a);
//高精度算法:用数组存储
int main()
{
vector<int>sum={0};
vector<int>multiply1={1};
vector<int> *p1=&multiply1;
vector<int> *p2=∑
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
multiply(p1, i);
add(p2,multiply1);
}
printV(sum);
return 0;
}
void add(vector<int>* a, vector<int>b)
{
int n1=a->size();
int n2=b.size();
long long all;
int i;
int surplus=0;
for(i=0;i<n2&&i<n1;i++)
{
all=a->at(i)+b[i]+surplus;
surplus=all/10;
a->at(i)=all%10;
}
if(n2==n1+1){
a->push_back((surplus+b[i])%10);
surplus=(surplus+b[i])/10;
while(surplus!=0)
{
a->push_back(surplus%10);//高精度加法里面其实不需要使用while循环
surplus=surplus/10;
}
}
else if(n2>n1+1)
{
while(i<n2)
{
a->push_back((surplus+b[i])%10);
surplus=(surplus+b[i])/10;
i++;
}
while(surplus!=0)
{
a->push_back(surplus%10);
surplus=surplus/10;
}
}
else if(n2==n1)
{
while(surplus!=0){
a->push_back(surplus%10);
surplus=surplus/10;
}
}
else if(n2==n1-1)
{
int temp=(a->at(i)+surplus)/10;
a->at(i)=(a->at(i)+surplus)%10;
while(temp!=0){
a->push_back(temp%10);
temp=temp/10;
}
}
else {
while(i<n1&&surplus!=0)
{
int temp=(a->at(i)+surplus)/10;
a->at(i)=(a->at(i)+surplus)%10;
surplus=temp;
}
while(surplus!=0){
a->push_back(surplus%10);
surplus=surplus/10;
}
}
return ;
}
void printV(vector<int>a){
int n=a.size();
for(int i=n-1;i>=0;i--)
{
cout<<a[i];
}
}
void multiply(vector<int>*a,int b)
{
int n=a->size();
int i,surplus=0;
for(i=0;i<n;i++)
{
int temp=((a->at(i))*b+surplus)/10;
a->at(i)=((a->at(i))*b+surplus)%10;
surplus=temp;
}
while(surplus!=0)
{
a->push_back(surplus%10);
surplus=surplus/10;
}
return;
}
标签:10,surplus,int,back,while,循环,push
From: https://www.cnblogs.com/hithin/p/17068152.html