注册 登录
编程论坛 C++教室

用 C++ 实现同或

苍翠的路 发布于 2014-09-02 14:57, 2650 次点击
输入包括两行,每行包括N个数字(1≤N≤50),分别表示两个人对于N个事情对应的看法——0表示不赞同、1表示赞同。
输出包括一行,包括N个数字,表示两人相遇后,对于这N件事情的最终看法。(相同为1,不同为0)
列如:
输入:001100
      110100
输出:000111

其中,N未知,只能通过所输入的数字判断。我的想法是用vector二维数组,然后利用回车作为第一个和第二个数组的分隔符,但得不到相应的结果,麻烦大家帮忙看看,十分感谢!
(作为新手,很多地方不够规范,也请大家多多指教)

程序代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int var;
    int num=50;
    vector< vector<int> > ivec(2);
    for(int i=0;i<2;++i)
    {
        ivec[i].reserve(num);
    }
    for(int ix=0;ix<2;++ix)
    {   
        while(cin>>var)
        {
            if(var!='\n')
            {
                ivec[ix].push_back(var);
            }
            else
                break;
        }
    }
    for(int indx=0;indx<num;++indx)
    {
        if(ivec[0][indx]!=ivec[1][indx])
        {
            cout<<0;
        }
        else
        {
            cout<<1;
        }
    }
    cout<<endl;
    return 0;
}
15 回复
#2
wp2319572014-09-02 15:35
我不会用c++

程序代码:

int main()
{
    char a[50]={'\0'};
    char b[50]={'\0'};
    char c[50]={'\0'};
    input(a,b);
    for(int i=0;i<strlen(a);i++) if(a[i]==b[i]) c[i]='1';else c[i]='0';
    printf("c[]=%s\n",c);
    return 0 ;
}
#3
苍翠的路2014-09-02 15:54
回复 楼主 苍翠的路
感谢版主的回复,input函数得自己定义的吧?
#4
wp2319572014-09-02 15:56
就是一个输入接收函数  因为我的代码和c++无关  所以开始没放这个函数

程序代码:

void input(char* a,char* b)
{
    int i=0;
reinput:
    printf("请输入第一个人的意见:(只能是0 1串)->");
    gets(a);
    while(i<strlen(a))
    {
        if(a[i]>'1') goto reinput;
        i++;
    }
reinput2:
    printf("请输入第二个人的意见:(只能是0 1串)->");
    gets(b);
    i=0;
    while(i<strlen(b))
    {
        if(b[i]>'1') goto reinput2;
        i++;
    }
    if((strlen(a)-strlen(b))!=0) goto reinput;
}
#5
苍翠的路2014-09-02 16:13
回复 3 楼 苍翠的路
感谢分享,收获不小,我看能不能学习下你的思路用C++实现出来。
#6
rjsp2014-09-03 08:41
回复 2 楼 wp231957
应该51吧,我猜
#7
stop12042014-09-03 10:21
程序代码:

让你看的明白点
#include "iostream"
int main()
{
         using namespace std;
    char a[50], b[50];
    int n1 = 0, n2 = 0;
    while (n1 < 50)
    {

        cin.get(a[n1]);
        if (a[n1] == '\n')
            break;
        n1++;
    }
    while (n2 < 50)
    {

        cin.get(b[n2]);
        if (b[n2] == '\n')
            break;
        n2++;
    }
    n1 < n2 ? n1 = n1  : n1 = n2;
    //n1 最短的那个有多少个字符,即以此判断要判断几次
    char p[n1];   //用来存储输出
    for (int i = 0; i < n1 ; ++i)
        a[i] == b[i] ? p[i] = '1' : p[i] = '0';
    p[n1] = '\0';
    cout << p ;
}
#8
stop12042014-09-03 10:22
还可以简化    不过你先看明白这个
#9
k_misuzu2014-09-03 14:58
回复 7 楼 stop1204
p[n1]中的n1不应该是变量吧
#10
stop12042014-09-03 17:32
回复 9 楼 k_misuzu
是变量-.-~  
所有都是变量 你看到 int n1=0; 定义没.....
#11
苍翠的路2014-09-03 21:20
回复 10 楼 stop1204
很清晰,实现起来简单明了,想看看更简化的版本,不知版主能否用vector实现功能,感激不已……
PS:我想楼上的哥们说的意思是定义char型数组时应该为常量,不能是变量。(编译时若为n1无法通过)
#12
rjsp2014-09-04 09:18
回复 11 楼 苍翠的路
为什么要用vector?bitset就能完成核心功能。如下代码中引入string只是为了测量输入长度
程序代码:
#include <iostream>
#include <string>
#include <bitset>

int main()
{
    std::string t;
    std::cin >> t;

    std::bitset<50> a(t), b;
    std::cin >> b;

    std::cout << ((~(a^b)).to_string().c_str()+50-t.size()) << std::endl;

    return 0;
}

如果你只想用单一容器的话,string就行了,自己完成同或操作
程序代码:
#include <iostream>
#include <string>
#include <cassert>

int main()
{
    std::string a, b;
    std::cin >> a >> b;

    assert( a.size() == b.size() );
    for( size_t i=0; i!=a.size(); ++i )
        a[i] = a[i]==b[i] ? '1' : '0';

    std::cout << a << std::endl;

    return 0;
}

#13
苍翠的路2014-09-04 12:08
回复 12 楼 rjsp
简单高效的方法,涨知识了,十分感谢
#14
k_misuzu2014-09-04 17:31
回复 10 楼 stop1204
我的意思是声明数组时不能用变量吧- -
#15
allmy342014-10-06 22:56
for(int ix=0;ix<2;++ix)
这句中的++ix应该放在else 里break的前面吧,不然输入回车后直接跳出去了,根本执行不了自加这句
#16
allmy342014-10-07 23:31
试验了一下,结束符不能用回车,改为#就可以了
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    char var;
    int num = 50;
    vector < vector < int >>ivec(2);
    for (int i = 0; i < 2; ++i)
    {
        ivec[i].reserve(num);
    }
    for (int ix = 0; ix < 2;++ix )
    {
        while (cin >> var)
        {
            if (var != '#')
            {
                ivec[ix].push_back(var-'0');
            }
            else
                break;
        }
    }
    if (ivec[0].size()<ivec[1].size())
        num=ivec[0].size();
    else
        num=ivec[1].size();
    for (int indx = 0; indx < num; ++indx)
    {
        if (ivec[0][indx] != ivec[1][indx])
        {
            cout << 0;
        }
        else
        {
            cout << 1;
        }
    }
    cout << endl;
    return 0;
}
1