C语言算鸡兔同笼问题遇困惑
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/19 04:07:35
C语言算鸡兔同笼问题遇困惑
这是我的代码:
#include
#include
void main()
{\x05unsigned long int a,b,c,d;/*其中a表鸡兔总数,b为鸡兔脚总数,c为鸡数,d为兔数*/
\x05printf("这是一个用于算鸡兔同笼的小程序(仅能输入整数,使用回车键切换)\n请输入鸡兔的总数");
\x05scanf("%d",&a);
\x05printf("请输入鸡兔脚的总数");
\x05scanf("%d",&b);
\x05c=(4*a-b)/2;
\x05d=a-c;
\x05if(c*2+d*4==b&&c>=0&&d>=0) printf("鸡有%ld只\n兔有%ld只",c,d);
\x05else printf("同学,我看你给的数有错吧!");
\x05Sleep(100000000);
}
已能编译成功,但使用if(c*2+d*4==b&&c>=0&&d>=0),却仍有输出负数却不报错的情况,
这是我的代码:
#include
#include
void main()
{\x05unsigned long int a,b,c,d;/*其中a表鸡兔总数,b为鸡兔脚总数,c为鸡数,d为兔数*/
\x05printf("这是一个用于算鸡兔同笼的小程序(仅能输入整数,使用回车键切换)\n请输入鸡兔的总数");
\x05scanf("%d",&a);
\x05printf("请输入鸡兔脚的总数");
\x05scanf("%d",&b);
\x05c=(4*a-b)/2;
\x05d=a-c;
\x05if(c*2+d*4==b&&c>=0&&d>=0) printf("鸡有%ld只\n兔有%ld只",c,d);
\x05else printf("同学,我看你给的数有错吧!");
\x05Sleep(100000000);
}
已能编译成功,但使用if(c*2+d*4==b&&c>=0&&d>=0),却仍有输出负数却不报错的情况,
unsigned long int a,b,c,d;
改为:
long int a,b,c,d;
unsigned表示无符号的
再问: 谢谢,无符号不就是0和正整数吗?
再答: 嗯,是的,所以判断d>=0时会通过。 一、补码: 1、正数的补码,就是它的二进制形式; 2、负数的补码,是它的绝对值的二进制形式,再按位取反,再加1; 二、而存储单元里就是用整数的补码存放的。 以Visual C++为例,存储 int 类型数据分配4个字节,每个字节8个位。 如: 3就是 00000000 00000000 00000000 00000011 -1就是 11111111 11111111 11111111 11111111 其中,最左一位(最高位)表示符号(0是正,1是负) 但是,unsigned int 的话,就指没有符号位,所有的二进位都存放数值。这也是为什么unsigned int存储的数更大: int最大数 (最高位0表示正) 01111111 11111111 11111111 11111111 (即2^31-1) unsigned int最大数 11111111 11111111 11111111 11111111(即2^32-1) 三、所以,以你输入的错误结果为例,(为了书写方便,暂且把d当成int 型,long型写起来太长,且long比int高,不影响结果)d= -95 ,存储时是 11111111 11111111 11111111 10100001 而你定义为unsigned int类型,最高位1不是表示符号,此时存储单元里表示的是大正数4294967201 当然符合d>=0 但你输出时又用了%d ,%d表示用int形式输出,当然又是-95,如果你改为%u输出,你会发现输出的是大正数4294967201. 四、long 和int 类型用%d输出恰好相同,也许没看出效果。你可试下short: unsigned short d=-95; printf("%d",d); 补码形式存储 11111111 101000001 用%d输出,得先换成00000000 00000000 11111111 101000001 也就成了65441 五、上面程序的话,或者可以在中间加个if判断改为 ......... c=(4*a-b)/2; if(a
改为:
long int a,b,c,d;
unsigned表示无符号的
再问: 谢谢,无符号不就是0和正整数吗?
再答: 嗯,是的,所以判断d>=0时会通过。 一、补码: 1、正数的补码,就是它的二进制形式; 2、负数的补码,是它的绝对值的二进制形式,再按位取反,再加1; 二、而存储单元里就是用整数的补码存放的。 以Visual C++为例,存储 int 类型数据分配4个字节,每个字节8个位。 如: 3就是 00000000 00000000 00000000 00000011 -1就是 11111111 11111111 11111111 11111111 其中,最左一位(最高位)表示符号(0是正,1是负) 但是,unsigned int 的话,就指没有符号位,所有的二进位都存放数值。这也是为什么unsigned int存储的数更大: int最大数 (最高位0表示正) 01111111 11111111 11111111 11111111 (即2^31-1) unsigned int最大数 11111111 11111111 11111111 11111111(即2^32-1) 三、所以,以你输入的错误结果为例,(为了书写方便,暂且把d当成int 型,long型写起来太长,且long比int高,不影响结果)d= -95 ,存储时是 11111111 11111111 11111111 10100001 而你定义为unsigned int类型,最高位1不是表示符号,此时存储单元里表示的是大正数4294967201 当然符合d>=0 但你输出时又用了%d ,%d表示用int形式输出,当然又是-95,如果你改为%u输出,你会发现输出的是大正数4294967201. 四、long 和int 类型用%d输出恰好相同,也许没看出效果。你可试下short: unsigned short d=-95; printf("%d",d); 补码形式存储 11111111 101000001 用%d输出,得先换成00000000 00000000 11111111 101000001 也就成了65441 五、上面程序的话,或者可以在中间加个if判断改为 ......... c=(4*a-b)/2; if(a