赞
踩
难点:
(1)读懂题意,熵怎么计算的
根据题目给出的例子,也就是S=100,H(S)如何计算,其实也就是 -p(1)log2p(1)-p(0)log2p(0)-p(0)log2p(0)=-1*p(1)log2p(1)-2*p(0)log2p(0),其实我们可以发现规律了吧。
h = -o*(o / n) * log2(o / n) - (n - o)*((n - o) / n) * log2((n - o) / n);
o表示0的个数,n表示总的个数,字符串不是0就是1,那1的个数很明显不就是n-o吗
-(o / n) * log2(o / n):表示的是一个0的信息熵是多少,那我字符串有多少个0不就是乘以多少就行来了吗。
-o*(o / n) * log2(o / n) :表示字符串中出现了几个0的,它们的信息熵总和是多少
- (n - o)*((n - o) / n) * log2((n - o) / n):表示字符串中出现了几个1,它们的信息熵总和是多少
(2)怎么判断浮点数是否在一个范围之内
浮点数的范围判断不像整数一样,而是要判断它是否属于某一范围,或者二者差的绝对值属于某一范围一般取<0.01。这个知识算是积累吧。记住就行了。所以应该怎么判断呢。
h > 11625907.5 && h < 11625907.6
(3)枚举0的个数,,枚举的范围应该是什么呢。
最小是0,这个是肯定的,最大应该是多少呢,题目中说0的个数比1少,也就是说0的个数应该小于总数的一半。
(4)n不能定义为整型,原因在注释中有。
代码如下:
- #include<iostream>
- #include<cmath>
- using namespace std;
-
- int main()
- {
- double h = 0;
- //如果n也定义为整型的话,由于o和n都是整数,这将导致整数除法,结果将丢失小数部分。
- double n = 23333333;
- int o = 0;
- for(o = 0;o < n/2;o++)
- {
- h = -o*(o / n) * log2(o / n) - (n - o)*((n - o) / n) * log2((n - o) / n);
- if(h > 11625907.5 && h < 11625907.6)
- {
- cout<<o<<endl;
- break;
- }
- }
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。