如图有A B C三组,(勾选完成后会返回一个值,该值是根据以下规则算出来的,)1.如果只勾选A组中的,得到的结果是他们对应的值相加再减去 (13 *(勾选的个数-1))2.如果只勾选B组中的,得到

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/04 19:35:47
如图有A B C三组,(勾选完成后会返回一个值,该值是根据以下规则算出来的,)1.如果只勾选A组中的,得到的结果是他们对应的值相加再减去 (13 *(勾选的个数-1))2.如果只勾选B组中的,得到

如图有A B C三组,(勾选完成后会返回一个值,该值是根据以下规则算出来的,)1.如果只勾选A组中的,得到的结果是他们对应的值相加再减去 (13 *(勾选的个数-1))2.如果只勾选B组中的,得到
如图有A B C三组,(勾选完成后会返回一个值,该值是根据以下规则算出来的,)
1.如果只勾选A组中的,得到的结果是他们对应的值相加再减去 (13 *(勾选的个数-1))
2.如果只勾选B组中的,得到的结果是他们对应的值相加再减去 (14 *(勾选的个数-1))
3.如果ABC组混合勾选了,那么各组以上面2条规则算出结果后,将各组的结果值相加,相加完后减去(12 *(混合的组数-1)) (注:混合的组数指的是如:AB混合那么即指2组)
(图中未设置值的为全选按钮不作考虑)
以上是规则
以下是问题:
1.我要根据一个值.这个值是根据上面的规则算出的结果如:3903 我想知道这个值“在修改状态下可见”这个选项目有没有被勾上(即值为141)
2:我同样根据这个值.我希望得到哪些条目被勾选上了
我要的是公式。两道题要两个公式。贴了公式就给分了。刚才一楼三楼都答对了。是怎么算的。贴公式出来就行了

如图有A B C三组,(勾选完成后会返回一个值,该值是根据以下规则算出来的,)1.如果只勾选A组中的,得到的结果是他们对应的值相加再减去 (13 *(勾选的个数-1))2.如果只勾选B组中的,得到
没必要把条目的值,设置的这么复杂.
如果是由你来编程,
你可以把从A1、A2……A5,到B1……B4、C1,顺序设置成十进制的
1、10、100、1000、10000…….
条目未选,就加0,选择了,就加上对应的数值.
这样把最终的和值当做字符串处理,字符串里有几个1,就是勾选了几项,
第几位是1,就代表这项被勾选.
同样,顺序设置成十进制的
1、2、4、8、16……(就是二进制的1、10、100、1000……)一样可以. 
后来我又研究了你的值设置,发现了里面的玄机.如附图:
每个选项的数值化为2进制,可以发现,后4位是选择状态信息,4位往前是一一对应选项的.
根据你的规则,如单选A、B或C中的一项、多项时,最终值的后四位为11XX的形式,即单选A中的一或多项,最终值的后四位为1101,单选B时1110,单选C时1100.
混合选择时,后四位11XX中多余的的1100(即十进制数12)被减掉,还是留下形如11XX的形式.
而最终值除去后4位,之前每位出现的1,唯一对应某一个选项.
因此判断3903,选择的选项值有:
2060、1038、526、270、45、29,没有选择141.
因此,解决了你的问题,只要把算出的结果化为2进制,咔嚓掉后4位,看前面的二位数,作判断和和查表,可以知道单选还是混选、选择了哪些项.

A选29,45,B选270,526,1038,C选2060可以得到3903

1.没有被勾选上。
2.B组和C组全选,从而算出A组只有前两项勾选上了。

你是面试遇到这道题?好像是把简单的问题搞复杂了来弄了。
首先稍微分析下各个值的来历:
A组:
1:29 = a
2:45 = 2a - 1 * 13
3:77 = 4a - 3 * 13(注意原来这里顺序有所颠倒,由小到大排后是这样)
4:141 = 8a - 7 * 13
B组
5:270 =16a - 15 * 13 +1...

全部展开

你是面试遇到这道题?好像是把简单的问题搞复杂了来弄了。
首先稍微分析下各个值的来历:
A组:
1:29 = a
2:45 = 2a - 1 * 13
3:77 = 4a - 3 * 13(注意原来这里顺序有所颠倒,由小到大排后是这样)
4:141 = 8a - 7 * 13
B组
5:270 =16a - 15 * 13 +1
6:526 =32a - 31 * 13 +1
7:1038=64a - 63 * 13 +1
C组
8:2060=128a- 127 * 13 -1
算法:
设最后值为M。
1,如果M >= 2060 那么当然8是被选上的,令M= M - 2060 + 12 ;此时如果M < 29 就结束,否则继续下面的;
2,M= M - 13 ;
3, 求M/16的余数,设为X0,
如果X0 = 0,则只有A区有被选;
如果X0 = 1,则只有B区有被选,M= M - 1;
如果X0 = 2,则A,B区都有被选,M= M - 2;
4,Z = M / 16.对Z做长除法除以2,即:
Z / 2 = Z1 余 X1
Z1 / 2 = Z2 余 X2
...
Zn-1 / 2 = Zn 余 Xn
一直做到商Zn = 0 就停止,X1为1表示1号项被选上,X1为0表示1号项没被选上;X2为1表示2号项被选上,X2为0表示2号项没被选上;
...Xn为1表示n号项被选上,Xn为0表示n号项没被选上。其他未出现的项都没被选上。算法结束。
比如3903
1,3903 > 2060 ,所以第8项被选上,3903 - 2060 + 12 = 1855 ;
2, 1855 - 13 = 1842
3, 1842 / 16 = 115余2,由余2可以看出A,B区都被选了
4, 1842 - 2 = 1840, 1840 / 16 =115,对115做长除法
115 / 2 = 57 余 1
57 / 2 = 28 余 1
28 / 2 = 14 余 0
14 / 2 = 7 余 0
7 / 2 = 3 余 1
3 / 2 = 1 余 1
1 / 2 = 0 余 1
因此从后向前,被选的项目是1,2,5,6,7,加上之前已经确认的8,结束。
验证下
1 2 5 6 7 8
29 + 45 -13 + 270 + 526 -14 + 1038 -14 -12 + 2060 -12 = 3903
3楼的二进制更说明了这道题的设计思路。不过后四位设计的比较失败,没法直接区分出单选A区和A,C区混选之类的情况。必须把C区的情况先排除。

收起