问题描述
在扩展我的程序以包含诸如 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)