微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用“贪婪”方法进行更改 - what(): std::bad_allock

如何解决使用“贪婪”方法进行更改 - what(): std::bad_allock

在扩展我的程序以包含诸如 0.01,0.02,0.05,0.1,0.2,0.5 (zł) 之类的更改后,我得到了:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

Process returned 3 (0x3)   execution time : 56.358 s
Press any key to continue.

这不是我第一次收到这条消息,但只会在使用向量时发生。

如果我不添加更新,程序会正常工作,但我很好奇为什么会弹出这个消息,以及它可能是什么原因。我想这与某些东西在内存中的位置不好有关吗?

感谢大家的帮助。

    #include <iostream>
#include <vector>
using namespace std;

int main(){

    int iloscMonet=9;
    double monety[iloscMonet]={0.01,0.5,1,2,5};
    double resztaDoWydania=4.01;
    int licznikMonet=0;
    vector <int> jakieMonety;
        while(resztaDoWydania){
            int nominal = 0;
            for(int i=0;i<iloscMonet;i++){
                if((monety[i]<=resztaDoWydania)&&(monety[i]>nominal)){
                    nominal=monety[i];
                }
            }
            resztaDoWydania-=nominal;
            jakieMonety.push_back(nominal);
            licznikMonet++;
        }
        cout<<"ile monet?: "<<licznikMonet<<endl;
        cout<<"jakie monety?: ";
        for(int i=0;i<jakieMonety.size();i++){
            cout<<jakieMonety.at(i)<<" ";
        }

    return 0;
}

解决方法

浮点数计算可能存在错误。

当我在您的代码顶部添加 #include <cstdio> 并在 printf("%.30f\n",resztaDoWydania); 之后添加 licznikMonet++; 时,我发现 resztaDoWydania 的值堆积在 0.009999999999999786837179271970。>

您应该尽可能避免使用浮点数。 在这种情况下,您可以将每个值乘以 100 以使其成为整数。

#include <iostream>
#include <vector>
using namespace std;

int main(){

    int iloscMonet=9;
    int monety[iloscMonet]={1,2,5,10,20,50,100,200,500};
    int resztaDoWydania=401;
    int licznikMonet=0;
    vector <int> jakieMonety;
        while(resztaDoWydania){
            int nominal = 0;
            for(int i=0;i<iloscMonet;i++){
                if((monety[i]<=resztaDoWydania)&&(monety[i]>nominal)){
                    nominal=monety[i];
                }
            }
            resztaDoWydania-=nominal;
            jakieMonety.push_back(nominal);
            licznikMonet++;
        }
        cout<<"ile monet?: "<<licznikMonet<<endl;
        cout<<"jakie monety?: ";
        for(int i=0;i<jakieMonety.size();i++){
            cout<<jakieMonety.at(i)<<" ";
            // if you want outpuf of floating-point numbers as the original
            //cout<<(jakieMonety.at(i)/100.0)<<" ";
        }

    return 0;
}
,

试试while(resztaDoWydania>0)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。