首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

出错`解决思路

2012-03-01 
出错`#includestdafx.h #includevector#include string#includeiostreamusingnamespacestdvector

出错`
#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;
}

热点排行