公式类运算
全网首发代码(真难啊
先看题目。。。
题目描述
给定一个字符串仅由 ASCII 可见字符组成的字符串 S
将 S 各字符转为 8 位二进制形式拼接得到一个新的字符串 S’
定义字符串 S的信息熵为 H(S)
其中 PS’i为 S’i在 S’中的占比
请你计算 H(S)
C++C++可使用 double log2(double) 进行计算
输入格式
输入字符串 S
输出格式
输出一个实数表示 H(S)
输出保留5位小数
为避免精度误差 C/C++请使用 printf(“%.5lf” , ans) 的方式进行输出
输入样例1
a
输出样例1
3.71089
样例解释1
S’=01100001S’=01100001
其中’0’ 占 5/8
其中’1 占 3/8
计算方法:
abcdefghijklmnopqrstuvwxyz
输出样例2
103.28410
数据规模
对于 50%的数据 1≤∣S∣≤5000
对于 100%的数据 1≤∣S∣≤100000
保证 S 仅由大小写字母和数字组成
看似很复杂,实则很复杂;
肝两年半肝出来的,记得点赞,又什么不懂的在评论区问。
#include<bits/stdc++.h>
#include<string>
using namespace std;
int Hamming_weight_1( char n )
{
int count_ = 0; //声明计数变量
while ( n != 0 ) //遍历
{
if( n%2 == 1 ) //满足尾数是1.
count_++;
n /= 2; //除2,右移一位。(二进制)
}
return count_;
}
int main(){
char a[100];
double sum=0;
double ans=0.0;
double p0=0,p1=0;
cin>>a;
for(int n=0;n<= strlen(a)-1;n++) p1 += Hamming_weight_1(a[n]);
p0 = strlen(a)*8-p1;
int p0len=p0;
int p1len=p1;
p0=p0/8/strlen(a);
p1=p1/8/strlen(a);
//cout<<p0<<" "<<p1<<endl;
//for(int n=0;n<= strlen(a)-1;n++){
ans=ans+p1*log2(p1)*p1len;
//cout<<ans<<" "<<endl;
ans=ans+p0*log2(p0)*p0len;
//cout<<ans<<" "<<endl;
sum=sum+ans;
ans=0;
p1=0;
//}
//cout<<p0<<" "<<p1<<endl;
//cout<<p0len<<" "<<p1len<<endl;
//ans=0;
//if(cin.get()=='\n') break;
printf("%.5lf",-sum);
}
好了,无了。。