使用所有测试用例将小数转换为二进制数

时间:2019-06-26 13:31:13

标签: c++

这是我的实现,我将数字取下来并通过数学计算将其放入堆栈中,但是即使我关于问题的逻辑是正确的,也无法产生正确的输出... 请检测我的实现中有什么问题。这是竞争性编程我学院的两家公司都提出了这个问题。因此,请帮助我更正实施...。 我只想知道我的实现有什么问题.....

实际问题: 输入: 输入的第一行包含一个整数T,它表示测试用例的数量。每个包含N的测试用例只有一行。 输出: 在一行中打印所有具有十进制值从1到N的二进制数字。 限制条件: 1≤T≤106 1≤N≤106

示例: 输入: 2 2 5

输出: 1 10 1 10 11 100 101

说明: 测试案例1:从1到2的二进制数字是1和10。

这是必需的输出 输入: 2 2 5

输出: 1 10 1 10 11 100 101

我的输出是: 输入: 1个 3 您的输出是:

这里有人可以告诉我输出错误的原因..

#include<iostream>
#include <stack> 
#include <queue> 
using namespace std;
int main()
{
    int T ;
    cin>>T;
    while(T--)
    {
        int  n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {   
            stack <int > s;
            int num=i;
            while(num>0)
            {  
                s.push(num%2);
                num=num/2 ;
            }
            for(int j=0;j<s.size();j++)
            {
                cout<<s.top();
                s.pop();
            }
            cout<<" ";
        }
        cout<<endl;
    }
return 0 

这是必需的输出

Input:
2
2
5

Output:
1 10
1 10 11 100 101

我的输出是:

For Input:
1
3
Your Output is:

这里有人可以告诉我输出错误的原因..

1 个答案:

答案 0 :(得分:0)

问题在这里:

for(int j=0;j<s.size();j++)
{
    cout<<s.top();
    s.pop();
}

假设s有四个元素。
在第一次迭代中,j为0,s.size()为4。
在第二个上,j是1,而s.size()是3。
在第三个上,j是2,而s.size()是2,因此循环终止。
那是两个迭代,而不是四个。

不用计算您要弹出的次数,只需弹出直到堆栈为空:

while (!s.empty())
{
    cout << s.top();
    s.pop();
}