すでに回答があるように、オーバーフローしているのが原因とおもいます。
プログラム中では、 数字 15 を 1111(10進) に変換しています。
そのため例えば 4095 は内部では 111111111111 の10進を作ろうとしていて、int の最大数を超えてしまいます。
この 2 進表記見えるような 10 進数への変換をしないコードを書いてみました。
c
1#include<stdio.h>
2// See http://www.harukitchen.com/program/binary.c
3// 2進表記の文字列をつくる
4void binary(char *b, int d)
5{
6 int i = 0, j = 0, tmp;
7 if (d < 0) return;
8 do {
9 b[i++] = d % 2 + '0';
10 } while(d >>= 1);
11 i--;
12
13 /* reverse */
14 while (i > j) {
15 tmp = b[j];
16 b[j] = b[i];
17 b[i] = tmp;
18 j++; i--;
19 }
20
21 b[i + j + 1] = '\0';
22 return;
23}
24
25int main(void) {
26 int x, y, z, z1;
27 int work;
28 int count = 0;
29
30 scanf("%d,%d", &x, &y);
31 for (z = x + 1; z < y; z++) {
32 if (z % 2 != 0) {
33 work = z;
34 z1 = 0;
35 while (work != 0) {
36 z1 = z1 * 2 + work % 2;
37 work /= 2;
38 }
39 if (z == z1) {
40 count++;
41 char buf[1000];
42 binary(buf, z);
43 printf("%d (%s)\n", z, buf);
44 }
45 }
46 }
47 printf("%d\n",count);
48}
実行例
katoy-MacBook-Pro:tmp katoy$ gcc 1.c
katoy-MacBook-Pro:tmp katoy$ ./a.out
0,17
1 (1)
3 (11)
5 (101)
7 (111)
9 (1001)
15 (1111)
6
$ ./a.out
4500,5000
4529 (1000110110001)
4593 (1000111110001)
4617 (1001000001001)
4681 (1001001001001)
4777 (1001010101001)
4841 (1001011101001)
4889 (1001100011001)
4953 (1001101011001)
8
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/02 08:54