出错`
#include "stdafx.h "
#include <vector>
#include <string>
#include <iostream>
using namespace std;
vector <int> f(vector <int> ::const_iterator beg1, vector <int> ::const_iterator end1, vector <int> ::const_iterator beg2, vector <int> ::const_iterator end2){
vector <int> result;
int k=0;
for(vector <int> ::const_iterator it=beg1; it!=end1; ++it){
int carry=0;
vector <int> temp;
int kk=k;
while(kk!=0){
temp.push_back(0);
--kk;
}
++k;
for(vector <int> ::const_iterator it2=beg2; it2!=end2; ++it2){
int r=0,i=0;
i=(*it)*(*it2)+carry;
r=i%10;
carry=i/10;
temp.push_back(r);
}
if(!k){
result.reserve(temp.size());
}else{
result.reserve(result.size()+5);
}
for(vector <int> ::iterator it=result.begin(), iter=temp.begin(); iter!=temp.end();++it, ++iter){
*it=(*it)+(*iter);
}
}
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector <vector <int> > ssvec;
cout < < " multiply \n ";
while(true){
cout < < "enter number to multiply:\n " < <endl;
string s; //这边·
cin> > s;
for(string::const_iterator preit=s.begin(), it=s.begin(); it!=s.end(); ++it ){
if(*it== '* '){
vector <int> num;
while(preit!=it){
num.push_back(static_cast <int> (*preit));
++preit;
}
ssvec.push_back(num);
preit=it+1;
}
}
vector <int> re;
re.push_back(1);
for(vector <vector <int> > ::const_iterator it=ssvec.begin(); it!=ssvec.end(); ++it){
re=f(re.begin(),re.end(), it-> begin(), it-> end());
}
for(vector <int> ::const_iterator it=re.begin(); it!=re.end(); ++it){
cout < <*it;
}
cout < <endl;
}
return 0;
}
我写的是一个任意多任意多的数相乘,我用string来存输入的数,等会再分别把各个相乘数存到vector <int> 。好象很笨的方法··调试提示说s是错误的指针`,给点提示,看不出为什么
[解决办法]
直接使用 char 数组就好了 ......
如果觉得 char 数组的预定义长度不方便,
可以使用 string接收,
然后动态分配:
string s;
char *p;
cin> > s;
p=new char[s.length()+1];
strcpy(p, s.c_str()); //然后处理 char数组 p 即可,也不需要使用 vector 了
[解决办法]
你的错误太多, 没法改, 以下是按你的思路重新写
注意:
1. 没有做错误检查;
2. 没有考虑负数相乘;
3. 没有优化, 完全按照你的思路.
你可以看看:))
#include <vector>
#include <string>
#include <iostream>
using namespace std;
void ConvertStringToIntDigits(const string& factor, vector <int> & digits)
{
string::const_iterator it = factor.begin();
while (it!=factor.end()) {
int digitNumber = *it- '0 ';
digits.push_back(digitNumber);
++it;
}
}
bool InputMultipliers(vector <vector <int> > & multipliers)
{
cout < < " Multiply \n ";
cout < < "Enter the numbers to do multiplication: number1*number2*number3.....\n " < <endl;
string expression;
cin> > expression;
string multifactor;
string::const_iterator it = expression.begin();
while(it!=expression.end()) {
if (*it== '* ') { // we have got a multifactor, convert it to vector <int>
vector <int> intDigits;
ConvertStringToIntDigits(multifactor, intDigits);
multipliers.push_back(intDigits);
// clear the multifactor for next use
multifactor.clear();
}
else {
multifactor.push_back(*it);
}
++it;
}
//the last multifactor
if(multifactor.size()> 0) {
vector <int> intDigits;
ConvertStringToIntDigits(multifactor, intDigits);
multipliers.push_back(intDigits);
}
return true;
}
void Multiply(const vector <int> & multiplier, int digit, vector <int> & product)
{
vector <int> ::const_reverse_iterator it = multiplier.rbegin();
vector <int> productReverse;
int carry = 0;
while (it!=multiplier.rend()) {
int _product = (*it)*digit + carry;
int remainder = _product%10;
productReverse.push_back(remainder);
carry = _product/10;
++it;
}
if (carry!=0) productReverse.push_back(carry);
// reverse the result
product.assign(productReverse.rbegin(), productReverse.rend());
}
void Add(const vector <int> & addend1, const vector <int> addend2, vector <int> & summation)
{
vector <int> ::const_reverse_iterator it1 = addend1.rbegin();
vector <int> ::const_reverse_iterator it2 = addend2.rbegin();
vector <int> sumReverse;
int carry = 0;
while (it1 !=addend1.rend() && it2!=addend2.rend())
{
int _summation = (*it1) + (*it2) + carry;
int remainder = _summation%10;
sumReverse.push_back(remainder);
carry = _summation/10;
++it1;
++it2;
}
if (it1==addend1.rend()) {
while (it2!=addend2.rend()) {
int _summation = (*it2) + carry;
int remainder = _summation%10;
sumReverse.push_back(remainder);
carry = _summation/10;
++it2;
}
}
else if (it2==addend2.rend()) {
while (it1!=addend1.rend()) {
int _summation = (*it1) + carry;
int remainder = _summation%10;
sumReverse.push_back(remainder);
carry = _summation/10;
++it1;
}
}
if (carry!=0) sumReverse.push_back(carry);
// reverse the result
summation.assign(sumReverse.rbegin(), sumReverse.rend());
}
void Multiply(const vector <int> & multiplier1, const vector <int> & multiplier2, vector <int> & product)
{
vector <int> partProduct;
vector <int> partSum;
int numZero = 0;
vector <int> ::const_reverse_iterator it = multiplier2.rbegin();
while (it!=multiplier2.rend()) {
partProduct.clear();
Multiply(multiplier1, *it, partProduct);
for (int i=0; i <numZero; ++i) partProduct.push_back(0);
Add(partSum, partProduct, partSum);
++it;
++numZero;
if (it!=multiplier2.rend()) {
partProduct.clear();
Multiply(multiplier1, *it, partProduct);
for(int i=0; i <numZero; ++i) partProduct.push_back(0);
Add(partSum, partProduct, partSum);
++it;
++numZero;
}
}
product.assign(partSum.begin(), partSum.end());
}
int main(int argc, char* argv[])
{
vector <vector <int> > multipliers;
vector <int> product;
product.push_back(1);
InputMultipliers(multipliers);
vector <vector <int> > ::const_iterator it = multipliers.begin();
while (it!=multipliers.end()) {
Multiply(*it, product, product);
++it;
}
//out put the result
vector <int> ::const_iterator itProd = product.begin();
while (itProd!=product.end()) {
cout < <*itProd;
++itProd;
}
cout < <endl;
system( "pause ");
return 0;
}