user-0 提问: 一根29cm长的尺子，只允许在它上面刻7个刻度。若要用它能量出1~ 29cm的各种整长度，刻度应如何选择？ 

回复:
user: user-1
content: 2楼写得挺好的，就是暴力，思路很清晰啊，怒赞

user: user-2
content: 这道题我始终觉得有bug，如果说是截成7段，那可能ls都满足，但题目只要求划刻度，要是这样，我觉得划个1就够了 1=1 2=1+1 3=1+1+1 。。。

user: user-2
content: 如果是截成7段，那确实没段只能用一次，如果是划刻度，就没这个限制了，因为每次都是用同一把尺子先量一个刻度，再量一个刻度，这样的话，同一个刻度重复使用没问题。 如果是截段，那也没规定每次测量只用几段，所以任何一种能组合出1-10的组合就能满足需求 比如 1 3 5 10 10 （如果非要7段，把后两个10调成两段即可） 1=1 2=3-1 3=3 4=3+1 5=5 6=5+1 7=5+3-1 8=5+3 9=5+3+1 10=10 11=10+1 12=10+3-1 13=10+3 14=10+3+1 15=10+5 16=10+5+1 17=10+5+3-1 18=10+5+3 19=10+5+3+1 20=10+10 。。。 29=10+10+5+3+1  所以觉得本题有bug，题目需求不严谨

user: user-3
content: 引用 4 楼 qybao 的回复:这道题我始终觉得有bug，如果说是截成7段，那可能ls都满足，但题目只要求划刻度，要是这样，我觉得划个1就够了 1=1 2=1+1 3=1+1+1 。。。 应该是只允许一次，其实按二进制位考虑即可，比29大且最小的2的n次幂是32 ，2^5 所以用1，2，4，8，16，29既可以量出所有的长度  1=1(b)=1 2=10(b)=2； 3=11(b)=2+1; 4=100(b)=4; 5=101(b)=4+1 6=110(b)=4+2 7=111(b)=1+2+4; 8=1000(b)=8; 9=1001(b)=8+1 10=1010(b)=8+2 11=1011(b)=8+2+1； 12=1100(b)=8+4 13=1101(b)=8+4+1 14=1110(b)=8+4+2 ..... 27=11011(b)=16+8+2+1 28=11100(b)=16+8+4; 29=11101(b)=29or16+8+4+1;

user: user-4
content: 仅供参考。代码如下： #include <stdio.h>  int main(void) { 	int flag, mark[9]; 	int a, b, c, d, e, f, g; 	int i, j; 	int count = 0; 	 	mark[0] = 0; 	mark[8] = 29; 	 	for(a=1; a<23; a++) 	{ 		mark[1] = a; 		for(b=a+1; b<24; b++) 		{ 			mark[2] = b; 			for(c=b+1; c<25; c++) 			{ 				mark[3] = c; 				for(d=c+1; d<26; d++) 				{ 					mark[4] = d; 					for(e=d+1; e<27; e++) 					{ 						mark[5] = e; 						for(f=e+1; f<28; f++) 						{ 							mark[6] = f; 							for(g=f+1; g<29; g++) 							{ 								mark[7] = g; 								 								flag = 1; 								 								for(i=0; i<8; i++) 								{ 									for(j=i+1; j<9; j++) 									{ 										flag |= (1 << (mark[j] - mark[i])); 									} 								} 								 								if(flag == 0x3fffffff) 								{ 									printf("NO.%d:\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\n", ++count, a, b, c, d, e, f, g); 								} 							} 						} 					} 				} 			} 		} 	} 	 	return 0; }   运行结果如下： E:\Workspace>tcc -run demo.c NO.1:   1       2       14      18      21      24      27 NO.2:   1       3       6       13      20      24      28 NO.3:   1       4       10      16      22      24      27 NO.4:   1       5       9       16      23      26      28 NO.5:   2       5       7       13      19      25      28 NO.6:   2       5       8       11      15      27      28

user: user-5
content: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 1 1 1                                  1          1       1       1       1    1   // 一根29cm长的尺子，只允许在它上面刻7个刻度。若要用它能量出1~29cm的各种整长度，刻度应如何选择？ void RulerResult(void) { 	struct 	{ 		bool test; 		int maxID; 		int minID; 	} 	result[29];  	int mark[9]; 	mark[0] = 0; 	mark[8] = 29;  	for (int a = 1; a < 23; ++a) 	{ 		for (int b = a + 1; b < 24; ++b) 		{ 			for (int c = b + 1; c < 25; ++c) 			{ 				for (int d = c + 1; d < 26; ++d) 				{ 					for (int e = d + 1; e < 27; ++e) 					{ 						for (int f = e + 1; f < 28; ++f) 						{ 							for (int g = f + 1; g < 29; ++g) 							{ 								mark[1] = a; 								mark[2] = b; 								mark[3] = c; 								mark[4] = d; 								mark[5] = e; 								mark[6] = f; 								mark[7] = g;  								memset(result, false, sizeof(result));  								for (int i = 0; i < 8; ++i) 								{ 									for (int j = i + 1; j < 9; ++j) 									{ 										int id = mark[j] - mark[i] - 1; 										result[id].test = true; 										result[id].maxID = mark[j]; 										result[id].minID = mark[i]; 									} 								}  								bool allTest = true; 								for (int i = 0; i < 29; ++i) 								{ 									if (result[i].test) 										continue;  									allTest = false; 									break; 								}  								if (allTest) 								{ 									for (int i = 0; i < 9; ++i) 									{ 										printf("%d ", mark[i]); 									}  									printf("\r\n");  									for (int i = 0; i < 29; ++i) 									{ 										printf("%d = %d - %d\r\n", i + 1, result[i].maxID, result[i].minID); 									}  									return; 								} 							} 						} 					} 				} 			} 		} 	} }   0 1 2 14 18 21 24 27 29 1 = 2 - 1 2 = 29 - 27 3 = 27 - 24 4 = 18 - 14 5 = 29 - 24 6 = 27 - 21 7 = 21 - 14 8 = 29 - 21 9 = 27 - 18 10 = 24 - 14 11 = 29 - 18 12 = 14 - 2 13 = 27 - 14 14 = 14 - 0 15 = 29 - 14 16 = 18 - 2 17 = 18 - 1 18 = 18 - 0 19 = 21 - 2 20 = 21 - 1 21 = 21 - 0 22 = 24 - 2 23 = 24 - 1 24 = 24 - 0 25 = 27 - 2 26 = 27 - 1 27 = 29 - 2 28 = 29 - 1 29 = 29 - 0 请按任意键继续. . .