String 奇怪的错误c++;在抛出';标准::逻辑错误';what():基本\u字符串::\u M\u构造null无效

String 奇怪的错误c++;在抛出';标准::逻辑错误';what():基本\u字符串::\u M\u构造null无效,string,c++11,String,C++11,我不明白为什么它会让我明白。如果不难,请给我解释一下。 我使用c++11这个程序应该将两个数字相乘并保存在数组中。 我重新设计了它,但仍然不起作用。请有人给一个答案。因为它必须起作用。如果你有问题,请我写一个评论下面。现在起作用了。谢谢大家 #include <iostream> #include<string.h> #include<vector> #include<cmath> #define MAX 5001 using namespace

我不明白为什么它会让我明白。如果不难,请给我解释一下。 我使用c++11这个程序应该将两个数字相乘并保存在数组中。 我重新设计了它,但仍然不起作用。请有人给一个答案。因为它必须起作用。如果你有问题,请我写一个评论下面。现在起作用了。谢谢大家

#include <iostream>
#include<string.h>
#include<vector>
#include<cmath>
#define MAX 5001
using namespace std;
string  multiply(string s , string s1)
{
    int  res[10000] , a[10000] , b[10000];

    int length;
    if(s.length() > s1.length())
        length = s.length();
    else
        length = s1.length();

    memset(a , 0 , sizeof(a));
    memset(b , 0 , sizeof(b));      
    for(int i = 0;i < 10000;i++)
    {
        if(i > length)
            break;
        a[i] = b[i] = 0;
        //cout<<s[i] << " " << s1[i]<<endl;
        if(i <= (int)s.length())
        {
            if(i < s.length())
                a[i] = int(s[s.length() - i-1]) - 48;

        }
        if(i <= (int)s1.length())
        {
            if(i < s1.length())
                b[i] = int(s1[s1.length() - i-1])- 48;
        }
        //cout<<a[i] << " " << b[i] << endl;
    }

    //cout<<endl;

    for(int i = 0;i < length+1;i++)
    {
        //cout<<a[i] << " " << b[i] << endl;
        b[i] += a[i];
        b[i+1] += b[i] / 10;
        b[i] %= 10;
        //cout<<b[i] << " " << a[i] << endl;
    }
    if(b[length] > 0)
        length++;
    string rez = "";
    for(int i = length-1;i >= 0;i--)
    {
       rez += char(b[i] + 48);
    //cout<<b[i];
    }   
    return rez;
}
bool is(long long n)
{
    if(n == 0 || n == 1)
    {
        return false;
    }
    if(n == 2)
        return true;
    for(long long i = 2;i <= sqrt(n);i++)
    {
        if(n % i == 0)
            return false;

    }
    return true;
}


int main()
{string arr[MAX];
vector<string> coins;
    arr[0] = "1";
    coins.push_back("2");
    int n;
    cin>>n;
    if(n< 12)
        cout<<1/0;
    cin.get();
    for(int i = 3;i <= 5000;i++)
        if(is(i))
           coins.push_back(to_string(i));
    for(int j = 0;j < (int)coins.size();j++)

    {
        for(int i = 1;i <= n;i++)
            if(i >= atoi(coins[j].c_str()))
             arr[i] = multiply(arr[i - atoi(coins[j].c_str())] , arr[i]);
    }

    cout<<arr[n];
    //cout<<multiply("2" , "22");
}
#包括
#包括
#包括
#包括
#定义最大5001
使用名称空间std;
字符串乘法(字符串s、字符串s1)
{
int res[10000],a[10000],b[10000];
整数长度;
如果(s.length()>s1.length())
长度=s.长度();
其他的
长度=s1.length();
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
对于(int i=0;i<10000;i++)
{
如果(i>长度)
打破
a[i]=b[i]=0;

//你可能想了解和。顺便说一句,当你设置一个向量的大小,然后使用
push_back
时,你就增加了向量的大小。你的向量
coins
在推完之后可以包含近10000个元素。前5000个是空字符串。@Someprogrammerdude它仍然不起作用(我重新定义了它)你认为行
coutLol的错误是什么(cin.get()),因为当我使用custome Input时,我使用了codeschef,而没有使用enter。你可能想了解和。顺便说一下,当你设置向量的大小,然后使用
push_back
时,你就增加了向量的大小。在所有的推送之后,向量
coins
可以包含近10000个元素。前5000个元素就是empty strings.@Someprogrammerdude它仍然不起作用(我重新编辑了它)你认为行
coutLol是什么,错误是(cin.get()),因为我在使用custome输入时使用了codeschef而没有使用enter