首页 > 其他分享 >循环

循环

时间:2023-01-26 20:23:21浏览次数:31  
标签:10 surplus int back while 循环 push

循环

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字符填充不足的位数

高精度运算(阶乘之和)

出错点:

  1. 加法的surplus最多两位数,push_back的时候只许求模/整除一次即可
  2. 高精度乘法时的surplus可能有好几位数,只求模/整除一次,有可能不够,导致过大的surplus保存在vector的一位int中,随着n的增大,雪球越滚越大,最终溢出,导致最终的结果出现负数
  3. vectora中的a是常指针
  4. 函数体传参时,注意使用地址传递,如果时拷贝传递,无法改变实际的值
  5. 注意过程中的溢出问题

DEBUG心得:

  1. 学会使用断点,跳过

不足之处:

  1. 使用了vector实现可变长度的“数组”,使用push_back()随时添加“数组”元素,但是带来了长度比较的麻烦
  2. 但是如果已知输入n的范围,可以直接定义(略大的)定长的数组,方便对齐,不需要长度比较
  3. 可以尝试使用c++的运算符重载
  4. 可以尝试实现高精度除法和高精度减法
#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=&sum;
    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

相关文章

  • Python入门之选择语句&循环语句练习
    """选择语句ifbool类型的条件:pass满足条件执行的语句else:不满足条件执行的语句----------------------------......
  • Python入门之初识while循环
    """循环语句while条件:循环体"""#死循环:循环条件永远是满足的。whileTrue:usd=int(input("请输入美元:"))print(usd*6.9)i......
  • 浙大“python->机器语言“的学习二(循环计算)
    辗转相除Euclid设a,b为两个自然数,欲求a,b的最大公约数若a%b为0,则b就是a,b的最大公约数,计算结束否则令a为b,而b为原来的a%b,重复步骤2a,b=map(int,input().spli......
  • 循环的魅力之冰冻QQ电脑管家6.9...
    效果截图如下,程序运行后,管家已经动弹不了了...主要代码如下: for(unsignedintnHand=10000;nHand<99999999;nHand++){//获取窗口标题......
  • 事件循环Event loop,宏任务与微任务
    任务挂起、同步任务执行结束执行队列中的异步任务、执行script标签内部代码、setTimeout/setInterval、ajax请、postMessageMessageChannel、setImmediate、I/O(Node.js)Prom......
  • Day03 - 关键字和循环
    0.倒序'''实现传入一个数字,来控制输出的次数,倒序输出数字'''#定义一个函数deftest_func(n):i=nwhilei>0:print(i)i-=1t......
  • Day04-if分支+循环语句
    一、if判断语句1、语句结构if条件语句:    满足条件运行的代码1    满足条件运行的代码22、if嵌套结构if条件语句1:  满足条件运行的代码1满足条件运......
  • JavaScript 循环引用
    JavaScript中的循环引用是指两个或多个对象之间相互引用的情况。这种情况下,这些对象就不能被垃圾回收机制正常回收,会导致内存泄漏。循环引用通常发生在对象之间相互包含......
  • 06 While循环详解
    While循环packagecom.zhan.base_2;publicclassTest06_While{publicstaticvoidmain(String[]args){inti=0;intn=0;intsu......
  • 07 do···while循环
    do···while循环代码packagecom.zhan.base_2;publicclassTest07_DoWhile{publicstaticvoidmain(String[]args){//输出1+2+3+···+100......