FOR循环中的向量输入导致运行时错误 - 调试超时

时间:2017-03-15 19:16:24

标签: c++ algorithm vector runtime-error c++14

我正在尝试将stdin的C ++程序调试为

2 1 /newline/
4

调试器输出(onlinegdb): - 虽然第二行正在阅读由问题提供的另一组输入;这次,向量arr没有显示输出4 设置args 从/home/a.out...done中读取符号 (gdb)继续
该程序没有运行 (gdb)运行

Starting program: /home/a.out </home/input.txt                                
2 1  

P.S. The program successfully compiles and runs for user provided input

3 2
3
4

P.S。那么,为什么程序中的循环首先不正确执行?

消息来源代码 -

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int m;
    cin>>m;
    int t;
    cin>>t;
    cout<<m<<" "<<t<<"\n";
    int sum=0;
    vector<int> arr(t);
    for(int i=0;i<t;i++)
        cin>>arr[i];                //arr[i]=k digit nos
    for(int i=0;i<t;i++)
        cout<<arr[i]<<" "; 
    int comb(int a, int b);         //6,2

    for(int i=0;i<t;i++)
    {
        if(m==arr[i]){
            cout<<m<<" a "<<9*pow(10,m-1)<<"\n";
        }
        if(m>arr[i]){
            cout<<m<<" b "<<9*pow(10,m-1)<<"\n";
        } 
        if(m<arr[i]){
            /*if(m==arr[i]-1){
            cout<<m<<" c "<<9*pow(10,arr[i]-1)-9<<"\n";  
            }
            else{*/
            sum=pow(10,arr[i])-1;
            for(int j=arr[i]-1;j>m;j++)
                sum=sum-comb(arr[i],j)*pow(9,arr[i]-j+1);
            cout<<" d "<<sum<<"\n";
            //}
        }
    }
    //for m upto 10^4, k<=10^5; else k=10^5
    return 0;
}
int comb(int a, int b) {      //6,2
        int j=1;
        int s=a;
        for(int k=a-1;k>b;k--)     //5,4,3
            s=s*k;
        for(int l=1;l<=b;l++)
            s=s/l;
        return s;
    }
    //It is a problem involving displaying number of integers with no digit //repeating more than m (=2 here) times for t(=1) inputs with each input //being a arr[i] (=4) digit number.

2 个答案:

答案 0 :(得分:0)

不确定是问题,但......是个问题

查看案例if (m<arr[i])(如果我理解正确,那就是你的情况,因为t是1;唯一有效的arr[i]arr[0],即4比2 m更好。

您的实际代码是

        for(int j=arr[i]-1;j>m;j++)
            sum=sum-comb(arr[i],j)*pow(9,arr[i]-j+1);

记住,arr[i]arr[0]是4,m == 2,您的代码变为

        for ( int j = 3 ; j > 2 ; j++ )
           sum -= comb(4, j) * pow(9, 5 - j);

所以j从3开始,递增直到j > 2;但是如果j从3开始并且递增则大于2。

我想你的代码应该减少 j;

之类的东西
        for ( auto j = arr[i] - 1 ; j > m ; ++j )
            sum -= comb(arr[i], j) * pow(9, arr[i]-j+1);

答案 1 :(得分:0)

@ max66指出了你的程序陷入循环的原因。

让我解释为什么vector arr没有显示输出4。

我认为您的输入正在正确阅读。但是gdb尚未打印出来。由于输出是缓冲的,因此不必在cout的同时将其打印在屏幕上。 如果你想这样做,那么你应该刷新输出。

for(int i=0;i<t;i++)
    cout<<arr[i]<<" "<<flush;