【问题标题】:Vector input in FOR loop causing run-time error - Debugging times outFOR 循环中的向量输入导致运行时错误 - 调试超时
【发布时间】:2017-03-15 19:16:24
【问题描述】:

我正在尝试将标准输入的 C++ 程序调试为

2 1 /newline/
4

调试器的输出(onlinegdb):- 当第二行被读取以获取问题提供的另一组输入时;这一次,向量 arr 没有显示输出 4 设置参数 从 /home/a.out 读取符号...完成。
(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

附:那么,为什么程序中的第一个 for 循环没有正确执行?

源代码-

#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.

【问题讨论】:

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


    【解决方案1】:

    不确定是不是这个问题,但是……是个问题

    查看if (m&lt;arr[i]) 的情况(如果我理解正确,这就是你的情况,因为t 是1;唯一有效的arr[i]arr[0],即4,并且大于m,即2).

    你的实际代码是

            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 &gt; 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);
    

    【讨论】:

      【解决方案2】:

      @max66 指出了为什么你的程序卡在循环中。

      让我解释一下为什么向量 arr 没有显示输出 4。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2016-02-07
        • 2018-05-17
        • 2020-10-05
        • 1970-01-01
        相关资源
        最近更新 更多