标题:奇怪的国家程序,详细问题见贴
取消只看楼主
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
结帖率:100%
 问题点数:0 回复次数:9 
奇怪的国家程序,详细问题见贴
例题:
有一个奇怪的国家,里面的国民对于事情的态度永远只有两面。当两个人遇到一起讨论一个事情的时候——两个持赞同观点的人遇到一起后会对这个事情都继续赞同;一个持赞同观点的人遇到一个持不赞同观点的人的时候,两人都会不再继续赞同;两个持不赞同观点的人遇到一起讨论后反而会对这个事情开始赞同。

输入包括两行,每行包括N个数字(1≤N≤50),分别表示两个人对于N个事情对应的看法——0表示不赞同、1表示赞同。

输出包括一行,包括N个数字,表示两人相遇后,对于这N件事情的最终看法。

样例输入

11100101
00101011

样例输出

00110001

以上是题目,代码及出现的问题我放在二楼,麻烦各位帮忙看下
搜索更多相关主题的帖子: 国家 
2016-06-01 14:19
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
先介绍下我的问题:我采用的是位运算,先异或再取反的做法,结果判断是正确的,就是最后输出的二进制码总是32位的01数字。实际需求只要输出右面8位就可以了。 麻烦看下是什么问题,下面是代码:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define N 50
//十进制转二进制
char tobinary(int n)
{
    char arr[N];    
    itoa(n,arr,2);
    printf("%s",arr);
}  
//01字符串转二进制数 
int str_binary(char str[])
{
    int i,n=0;
    for(i=0;str[i]!='\0';i++)
    {
        if(str[i]=='1' || str[i]=='0')    //判断第i个字符是否是'1'或'0',如果是执行下面语句
        {
            n<<=1;    //把已经得到的n值左移1位,等同于乘以2
            n+=str[i]-'0';    //字符'1'减去'0'就等于1,字符'0'减去'0'当然是0,所以这句的意思是把第i个字符所对应的数加到n上去
        }
        else
        {
            printf("不是二进制数\n");
            return 1;
        }
    }
//  printf("%d\n",n);
    return n;
//  tobinary(n);
}
int main()
{
    char a[N],b[N];
    int na=0,nb=0,nc=0;
    gets(a);
    gets(b);
    na=str_binary(a);
    nb=str_binary(b);
    nc=~(na^nb);
//  printf("%d\n",nc);
    tobinary(nc);
}


[此贴子已经被作者于2016-6-1 14:24编辑过]

2016-06-01 14:21
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
测试如下:
输入

11100101
00101011
应该输出

00110001  
但实际输出:11111111111111111111111100110001   (最右面8位是需要的,左面多了24个1)
依稀感觉是补码还是掩码方面的问题,亦或是操作系统方面的原因,这部分不是很懂,哪位帮忙解释下,如何修改呢?谢谢.

ps:题目简单理解就是1和1得1,1和0得0,0和0得1,即相同得1,不同得0;所以我也想过直接判断两个字符串相同位置是否相等输出1,否则输出0,也另外写了个程序通过测试了。这个贴就是想学习下位运算方面的东西。


[此贴子已经被作者于2016-6-1 14:39编辑过]

2016-06-01 14:29
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
程序代码:
//十进制转二进制
char tobinary(int n,int len)
{
    int i=0;
    char arr[N];    
    itoa(n,arr,2);
//    printf("%s\n",arr);
    for(i=N-len;i<N;i++)        //len是在main中增加了len=strlen(a);
        printf("%c",arr[i]);
}  

我改变了最后输出的方法,用for循环输出与字符串a同样长度的arr数组中的最右面几个字符,为啥输出是汉字啊。。

[此贴子已经被作者于2016-6-1 15:08编辑过]

2016-06-01 15:04
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
哈哈,解决了,数组长度50,实际只用了前32位,所以不是N-len,循环条件应该是N-18-len,i<N-18,i++
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50
//十进制转二进制
char tobinary(int n,int len)
{
    int i=0;
    char arr[N];    
    itoa(n,arr,2); 
//itoa()函数作用是将数字n转化为二进制字符串存入数组arr中,第三个参数2可以是其他进制,此函数windows特有,不能用于其他平台,没有可移植性
//    printf("%s\n",arr);
    for(i=N-18-len;i<N-18;i++)
        printf("%c",arr[i]);
}  
//01字符串转二进制数 
int str_binary(char str[])
{
    int i,n=0;
    for(i=0;str[i]!='\0';i++)
    {
        if(str[i]=='1' || str[i]=='0')    //判断第i个字符是否是'1'或'0',如果是执行下面语句
        {
            n<<=1;    //把已经得到的n值左移1位,等同于乘以2
            n+=str[i]-'0';    //字符'1'减去'0'就等于1,字符'0'减去'0'当然是0,所以这句的意思是把第i个字符所对应的数加到n上去
        }
        else
        {
            printf("不是二进制数\n");
            return 1;
        }
    }
//    printf("%d\n",n);
    return n;
//    tobinary(n);
}
int main()
{
    char a[N],b[N];
    int na=0,nb=0,nc=0,str_length=0;
    gets(a);
    gets(b);
    str_length=strlen(a);
//  printf("str_length=%d\n",str_length);
    na=str_binary(a);
    nb=str_binary(b);
    nc=~(na^nb);
//  printf("%d\n",nc);
    tobinary(nc,str_length);
    printf("\n");
    return 0;
}


[此贴子已经被作者于2016-6-1 15:37编辑过]

2016-06-01 15:14
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
回复 7楼 吹水佬
不是的,我就是最近刚好看到这部分内容,一直来都不是很明白,所以自己动手练练,是我自己非要用这个方法的。
我想如果用字符串挨个对应位置判断是否相同就可以了是吧,我也写了个,是比用位运算简单些
程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
    char a[50], b[50], c[50];
    int i=0, j=0;
    int na, nb;
    scanf("%s", a);
    scanf("%s", b);
    na = strlen(a);
    nb = strlen(b);
    if(na < 1 || na > 50 || nb < 1 || nb > 50 || na != nb) 
        return 0;
    while(i < na)
    {
        if(a[i] == b[i])
            c[i] = '1';
        else
            c[i] = '0';
        i++;
    }
    for(i = 0; i < na; i++)
        printf("%c", c[i]);
    return 0;
}
2016-06-02 08:31
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
回复 6楼 至尊龙
我也是个新手,最多也就算比你先加入这个论坛而已。教什么的真谈不上,有疑问的地方或知识点,你放到论坛上,还是会得到很多朋友的帮助的。
我也经常求助于这个论坛的。
2016-06-02 08:33
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
回复 9楼 rjsp
嗯,改变字符串长度我也试了,如果修改了输入的字符串长度,最后输出C字符串的时候要修改的字符串的长度的。也就是我后面改过的输入字符串的方法,只能针对特定长度。这个程序主要目的是我用来练习位运算的。解决这个习题其实不用这么麻烦的,而且中间用的函数可移植性不好。


[此贴子已经被作者于2016-6-2 08:43编辑过]

2016-06-02 08:37
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
回复 12楼 wmf2014
嗯,所以我想先异或再取反就能得到需要的结果了。就是在最后输出的时候总是32位数字,就是对这个地方不是很明白。能帮我解释下吗?是我定义的变量数据类型决定的吗?虽然我定义了数组长度是50,修改成51了,但当我输入需要判断的字符串a,b长度大于32的时候,最后的结果也只有32位。

[此贴子已经被作者于2016-6-2 08:56编辑过]

2016-06-02 08:46
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
回复 13楼 rjsp
谢谢,精炼高效,我试了输入长度超过51的时候有时候输出也是正确的。有时候输出就不对了。是不是scanf这个函数的原因啊

[此贴子已经被作者于2016-6-2 09:07编辑过]

2016-06-02 08:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-465469-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.354596 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved