| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4157 人关注过本帖
标题:奇怪的国家程序,详细问题见贴
只看楼主 加入收藏
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
结帖率:100%
收藏
 问题点数:0 回复次数:17 
奇怪的国家程序,详细问题见贴
例题:
有一个奇怪的国家,里面的国民对于事情的态度永远只有两面。当两个人遇到一起讨论一个事情的时候——两个持赞同观点的人遇到一起后会对这个事情都继续赞同;一个持赞同观点的人遇到一个持不赞同观点的人的时候,两人都会不再继续赞同;两个持不赞同观点的人遇到一起讨论后反而会对这个事情开始赞同。

输入包括两行,每行包括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
至尊龙
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-6-1
收藏
得分:0 
大神好厉害,我是一个网络小白,想学c语言,能教教我吗???
2016-06-01 19:05
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
为什么要 字符串转数值 再 数值转字符串,规定要用位运算吗?
2016-06-01 23:19
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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 5楼 wanglianyi1
输入50个字符的case测试一下看看
2016-06-02 08:32
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 6楼 至尊龙
我也是个新手,最多也就算比你先加入这个论坛而已。教什么的真谈不上,有疑问的地方或知识点,你放到论坛上,还是会得到很多朋友的帮助的。
我也经常求助于这个论坛的。
2016-06-02 08:33
快速回复:奇怪的国家程序,详细问题见贴
数据加载中...
 
   



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

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