C语言编程题,整形的内码对称问题。

Description:C++中int型整数内码是一个32位的01序列,该01序列有些是对称的,有些是不对称的。对于给定的一个整数,在一些场合,需要判断其整数内码的对称性。这个事情要做好还非你不行呢。
Input:输入中含有一些整数n(0≤n<2^32)。Output:统计其中一共有多少个其内码对称的整数,输出之。Sample Input:0
1
2147483649
2
3
Sample Output:2
下面是我写的程序、
#include<iostream>
#include<cstring>
using namespace std;
int panduan(char *s)
{
int i,flag=true;
for(i=0;i<strlen(s);i++)
{
if(s[i]!=s[strlen(s)-1-i])
flag=false;
}
return flag;
}
main()
{
int a;
int counter=0;
while(cin>>a)
{
char s[33];
for(int i=0;i<32;i++)
{
s[i]=a%2+48;
a=a/2;
}
s[i]=0;
if(panduan(s)==1)
counter++;
}
cout<<counter<<endl;
}
有一个测试数据超出了int的范围,不能正常计算啊。
还有,while(cin>>a)和while(scanf("%d",&a)!=EOF) 有什么区别啊,哪位大神给看看。
最后,读取内码的方式是不是这样啊。

#include<iostream>
#include <stdio.h>
using namespace std;

int panduan(char *s)
{
int i, flag=true;

// 既然知道是32为整数,有时参数可以用常量(比如i<16)
for(i=0;i<16;i++)
{
if(s[i]!=s[31-i])
{
flag=false;
break; // 若已知不对称,循环可以提前退出
}
}
return flag;
}
int main()
{
int a;
int counter=0;

// cin>>a 和scanf("%d",&a)!=EOF有区别
// 在a=-1时前者会以为是文件结束,后者不会
while(scanf("%d",&a) != EOF)
{
char s[32];
for(int i=0;i<32;i++)
{
s[i]=a%2; // 用a&1更好一些,以为位操作比取模操作快
a >>= 1; //这里不能用a=a/2,如果a是负数,符号位1不会因为除法运算而移动
}
if(panduan(s)==1)
counter++;
}
cout<<counter<<endl;
return 0;
}追问

a >>= 1 大哥,不好意思,我刚学完C语言,C++还没看完,所以不懂这个,这个换成C怎么写。

还有 a&1什么意思啊,这方面我没看。

追答

&是与运算
a&b,当且仅当a!=0 && b != 0时,结果为1(其他情况为0)

C语言版:
#include
int panduan(char *s){
for(int i=0;i>= 1;
}
if(panduan(s)==1)
counter++;
}

printf("%d\n",counter); return 0;
}

追问

不是吧?我刚找了一下这方面的书,7&5的值是5啊~

追答

哦,我说的是一位的情况(a和b都是一位,取值0或1)

7&5的值的确是5,这是32位01编码分别进行与运算的结果。

学校要断电了,快没网了,我先下线了……
对了,上面
for(int i=0;i>= 1;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-01-11
简单
几次移位运算加一次补码,就可以了
不用你那么麻烦
你最后的问题我也不是很懂,不过可以肯定的是换成机器码后其实是一种方式
高级语言的区别罢了
还有读取内码用移位运算

代码如下
for(i=0;i<16;i++)
if(((s<<(31-i))>>31)!=((s<<i)>>31))
break;
return i==16?1:0;
跟我第一次想的不一样,纠结了
2楼说的不错,s要定义为unsigned long追问

⊙﹏⊙b汗 位运算那方面我一片空白

第2个回答  2013-01-11
范围是0到2^32,明显是提示你用unsigned int嘛

C语言编程题,整形的内码对称问题。
include<iostream> include <stdio.h> using namespace std;int panduan(char *s){ int i, flag=true;\/\/ 既然知道是32为整数,有时参数可以用常量(比如i<16)for(i=0;i<16;i++){ if(s[i]!=s[31-i]){ flag=false;break; \/\/ 若已知不对称,循环可以提前退出 } } return flag;} ...

C语言问题。。。
因为你这里是用getchar函数来输入的,getchar函数的返回值是字符类型,也就是说只能输入字符串,然后赋给变量c(int类型)的时候,将被转换为内码,所以c存储的将是字符内码,接下来的switch后面也是减字符内码(c-'2'相当于c-50)比方说你输入的第1个字符'2'("2473"的第1个字符),c的值是50,因...

c语言整数内码是什么意思
在C语言中,整数内码是将整数类型的数值转换为计算机可识别的二进制数值。在计算机内部,所有数据都以0和1的二进制形式存储。整数内码是将十进制的整数值转换为二进制数值,以便计算机对其进行识别和处理。C语言的整数类型包括char、short、int和long等,它们的内码长度和表示范围有所不同。C语言整数内码的...

c语言问题 内码=区位码+A0A0H 汉字的区位码为1601 算内码怎么操作?A0A0H...
第二字节内码=位码+160 A0A0就是这两个字节的160拼起来的16进而已 这我透熟

C语言编程题 输入4个整数,通过Dec3Bin 显示机内码
4应该为printf("%s\\n", a); 显示输出整个转换后的字符串 其余都没问题

请教一下C语言问题。。。急急急。。。
第一题 GB2312编码为16位,ASCII吗为8位 CB F5; D0 B4 ; CA C7; D6 B8;这是4个汉字,都是16位 50; 43 这是两个英文,各8为 汉字都是以字母开头的4个16进制的,英文都是2个16进制的,以数字开头 http:\/\/www.knowsky.com\/resource\/gb2312tbl.htm 这个是gb2312的中文表 第二题 K...

关于c语言中判断汉字的问题
例如:汉字“啊”的汉字机内码为B0A1H 表示成双字节是这样的10110000 10100001 本程序用的就是判断最高位的方法。int is_zh_ch(char p){ if(~(p >> 8)== 0)将p字节进行移位运算,右移8位,这样,如果移位后是0,则说明原来的字节最高位为0,不是1那么也就不是汉字的一个字节。{ return...

C语言中 union的问题,int i赋初值,输出k【0】为int的值,但是输出float...
数组元素没有全部初始化的情况下,未初始化元素都是0或空),因此是默认值0(字符为'\\0')而10的二进制如果作float类型读取,则是相当于0乘以2的10次方,结果也是0。注意float的二进制长度和int相同,float类型前面是基数后面是指数,因此10被当作指数处理(不过如果用%d来输出成员j,仍可得到10)...

C语言中数组怎么把任意两个单字节的字符变成一个双字节的字符
意味着这两个单字节其实是一个双字节能表达的字符的分别字节?\/\/ 假设是这样的\/* 以GBK为例子,嗯,微软默认控制台内码为GBK *\/比如“我”字,你得先查到内码为:CED2从下面可以查...当然百度一下到处都是http:\/\/www.mytju.com\/classcode\/tools\/encode_gb2312.asp\/\/ 然后发现,这个是多字节...

我要报考了计算机3级考试,请大家给个意见
只要你“背功”好,通过一定没问题!机试考的是C语言的知识,只有一道题,是编程题。其实也可以算是程序填空,题目中给了头和尾,只要求你填中间部分。你可以参照南开大学的C语言编程练习题,俗称“南开一百题”。书中共有一百道编程题,但有很多可以归到同一类。注意:这是机试的题库,机试的题全部出自此书!总之,...

相似回答