关于STL里的reverse算法的问题,请高手指教,不知道是不是BUG
以下是小弟的代码:
————————————————————————————————————————————
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<fstream>
typedef unsigned long Ulong;
using namespace std;
void add(vector<int> &,int jin,vector<int> &m);
void add(vector<int> &v,int jin,vector<int> &m)
{
m.push_back(0);
for(Ulong i=0; i<v.size(); i++)
{
if((v[i]+v[v.size()-i-1]) >= jin)
{
m[i]+=(v[i]+v[v.size()-i-1])%jin;
m.push_back(1);
}
else
{
m[i]+=(v[i]+v[v.size()-i-1])%jin;
m.push_back(0);
}
}
if((v[0]+v[v.size()-1]) < jin)
{
m.erase(m.end()-1,m.end());
}
reverse(m.begin(),m.end());
copy(m.begin(),m.end(),ostream_iterator<int>(cout));
cout << endl;
}
int main()
{
ofstream out("a.txt");
vector<int> v;
vector<int> sum;
int jin,flag=1;
Ulong k=1;
string m;
cout << "请输入2-10进制;";
cin >> jin;
cout << "请输入数字:";
cin >> m;
for(Ulong i=0; i<m.size(); i++)
{
v.push_back(m[i]-'0');
}
while(flag)
{
add(v,jin,sum);
for(Ulong i=0; i<sum.size()/2; i++)
{
if(sum[i] != sum[sum.size()-i-1])
{
flag = 1;
break;
}
else
{
flag = 0;
}
}
cout << "Step" << k << ": ";
out << "Step" << k << ": ";
copy(v.begin(),v.end(),ostream_iterator<int>(cout));
copy(v.begin(),v.end(),ostream_iterator<int>(out));
cout << " + ";
out << " + ";
reverse(v.begin(),v.end()); //下面输出结果出错的地方
copy(v.begin(),v.end(),ostream_iterator<int>(cout));
copy(v.begin(),v.end(),ostream_iterator<int>(out));
reverse(v.begin(),v.end());
cout << " = ";
out << " = ";
copy(sum.begin(),sum.end(),ostream_iterator<int>(cout));
copy(sum.begin(),sum.end(),ostream_iterator<int>(out));
cout << endl;
out << endl;
v = sum;
sum.clear();
k++;
}
system("pause");
}
--------------------------------------------
以下是结果:
---------
这个程序是个测试回文数的程序
先输入进制:10
然后输入数字:196
得到的结果是:
Step1: 196 + 691 = 887
Step2: 887 + 788 = 1675
Step3: 1675 + 5761 = 7436
Step4: 7436 + 6347 = 13783
Step5: 13783 + 38731 = 52514
Step6: 52514 + 41525 = 94039
Step7: 94039 + 93049 = 187088
Step8: 187088 + 880781 = 1067869
Step9: 1067869 + 9687610 = 11036639 //注意这里,我用的reverse算法,但是反转后有错误
Step10: 11036639 + 93663101 = 1131021040
Step11: 1131021040 + 0410210311 = 16433351//这里也有同样的问题
Step12: 16433351 + 15333461 = 31766812
Step13: 31766812 + 21866713 = 53633525
Step14: 53633525 + 52533635 = 106167160
Step15: 106167160 + 061761601 = 167928761
Step16: 167928761 + 167829761 = 335758522
Step17: 335758522 + 225857533 = 561616055
Step18: 561616055 + 550616165 = 1112232220
Step19: 1112232220 + 0222322111 = 1334554331
-----------------------------------
而且在Step9 的结果也不对
以上是测试程序
但是我直接使用1067869作为测试数据的时候就没有问题,请高手指教!!
————————————————————————————————————————————
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<fstream>
typedef unsigned long Ulong;
using namespace std;
void add(vector<int> &,int jin,vector<int> &m);
void add(vector<int> &v,int jin,vector<int> &m)
{
m.push_back(0);
for(Ulong i=0; i<v.size(); i++)
{
if((v[i]+v[v.size()-i-1]) >= jin)
{
m[i]+=(v[i]+v[v.size()-i-1])%jin;
m.push_back(1);
}
else
{
m[i]+=(v[i]+v[v.size()-i-1])%jin;
m.push_back(0);
}
}
if((v[0]+v[v.size()-1]) < jin)
{
m.erase(m.end()-1,m.end());
}
reverse(m.begin(),m.end());
copy(m.begin(),m.end(),ostream_iterator<int>(cout));
cout << endl;
}
int main()
{
ofstream out("a.txt");
vector<int> v;
vector<int> sum;
int jin,flag=1;
Ulong k=1;
string m;
cout << "请输入2-10进制;";
cin >> jin;
cout << "请输入数字:";
cin >> m;
for(Ulong i=0; i<m.size(); i++)
{
v.push_back(m[i]-'0');
}
while(flag)
{
add(v,jin,sum);
for(Ulong i=0; i<sum.size()/2; i++)
{
if(sum[i] != sum[sum.size()-i-1])
{
flag = 1;
break;
}
else
{
flag = 0;
}
}
cout << "Step" << k << ": ";
out << "Step" << k << ": ";
copy(v.begin(),v.end(),ostream_iterator<int>(cout));
copy(v.begin(),v.end(),ostream_iterator<int>(out));
cout << " + ";
out << " + ";
reverse(v.begin(),v.end()); //下面输出结果出错的地方
copy(v.begin(),v.end(),ostream_iterator<int>(cout));
copy(v.begin(),v.end(),ostream_iterator<int>(out));
reverse(v.begin(),v.end());
cout << " = ";
out << " = ";
copy(sum.begin(),sum.end(),ostream_iterator<int>(cout));
copy(sum.begin(),sum.end(),ostream_iterator<int>(out));
cout << endl;
out << endl;
v = sum;
sum.clear();
k++;
}
system("pause");
}
--------------------------------------------
以下是结果:
---------
这个程序是个测试回文数的程序
先输入进制:10
然后输入数字:196
得到的结果是:
Step1: 196 + 691 = 887
Step2: 887 + 788 = 1675
Step3: 1675 + 5761 = 7436
Step4: 7436 + 6347 = 13783
Step5: 13783 + 38731 = 52514
Step6: 52514 + 41525 = 94039
Step7: 94039 + 93049 = 187088
Step8: 187088 + 880781 = 1067869
Step9: 1067869 + 9687610 = 11036639 //注意这里,我用的reverse算法,但是反转后有错误
Step10: 11036639 + 93663101 = 1131021040
Step11: 1131021040 + 0410210311 = 16433351//这里也有同样的问题
Step12: 16433351 + 15333461 = 31766812
Step13: 31766812 + 21866713 = 53633525
Step14: 53633525 + 52533635 = 106167160
Step15: 106167160 + 061761601 = 167928761
Step16: 167928761 + 167829761 = 335758522
Step17: 335758522 + 225857533 = 561616055
Step18: 561616055 + 550616165 = 1112232220
Step19: 1112232220 + 0222322111 = 1334554331
-----------------------------------
而且在Step9 的结果也不对
以上是测试程序
但是我直接使用1067869作为测试数据的时候就没有问题,请高手指教!!
...全文
相关推荐
STL forward pause reverse.rar
在这个"STL forward pause reverse.rar"压缩包中,我们可以推测它包含的是一个使用STL语言编写的三菱PLC程序示例,用于实现设备的前进、暂停和后退功能。
C++ STL库函数总结(纯手打,主要偏向ACM竞赛方面使用)
、集合(set)应用集合(set)可以用于解决许多实际问题,如:* 元素去重复* 快速查找元素* 元素排序五、总结C++ STL 库函数总结中的集合(set)部分提供了一个强大的工具,用于解决实际问题。
STL所有算法描述70个
STL算法大致分为以下四类:1. 非可变序列算法:这类算法不直接修改容器内容,只是读取容器中的数据进行操作,例如查找算法。2. 可变序列算法:这类算法可以修改容器的内容,通常包括赋值、交换等操作。
C++ STL算法实现大数计算
C++ STL算法实现大数计算本文将详细介绍C++ STL算法实现大数计算的知识点,包括大数计算的原理、C++ STL容器的应用、算法实现的步骤等。
STL入门ppt算法
STL的核心思想是将算法、数据结构和迭代器这三个关键概念分离,使得程序员可以独立地改变它们,而不影响其他部分。


