给定一个二进制字符串,例如“10100101”,计算并输出字符串中0的个数以及所有数字之和
时间: 2024-05-12 18:19:36 浏览: 196
算法:
1. 初始化计数器count为0,sum为0。
2. 遍历字符串中的每个字符,如果是'0',则count加1,如果是'1',则将字符转换为数字并加到sum中。
3. 输出count和sum。
Python 代码:
```
s = input() # 输入二进制字符串
count = 0
sum = 0
for c in s:
if c == '0':
count += 1
elif c == '1':
sum += 1
print("Number of zeros:", count)
print("Sum of digits:", sum)
```
示例输出:
```
输入:10100101
输出:Number of zeros: 4
Sum of digits: 5
```
相关问题
用C语言编写程序。基于哈夫曼树的数据压缩算法 描述:输入一串字符串,根据给定的字符串中字符出现的频率建立相应哈夫曼树,构造哈夫曼编码表,在此基础上可以对待压缩文件进行压缩(即编码),同时可以对压缩后的二进制编码文件进行解压(即译码)。 输入:多组数据,每组数据一行,为一个字符串(只考虑26个小写字母即可)。当输入字符串为“0”时,输入结束。 输出:每组数据输出2n+4行(n为输入串中字符类别的个数)。第一行为统计出来的字符出现频率(只输出存在的字符,格式为:字符:频度),每两组字符之间用一个空格分隔,字符按照ASCII码从小到大的顺序排列。第二行至第2n行为哈夫曼树的存储结构的终态(形如教材139页表5.2(b),一行当中的数据用空格分隔)。第2n+2行为每个字符的哈夫曼编码(只输出存在的字符,格式为:字符:编码),每两组字符之间用一个空格分隔,字符按照ASCII码从小到大的顺序排列。第2n+3行为编码后的字符串,第2n+4行为解码后的字符串(与输入的字符串相同)。
以下为C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CHAR_NUM 26 // 最多只考虑26个小写字母
#define MAX_TREE_NODE_NUM (2 * MAX_CHAR_NUM - 1)
#define MAX_CODE_LENGTH 20
typedef struct TreeNode {
int weight;
int parent;
int left_child;
int right_child;
} TreeNode;
typedef struct Code {
char ch;
char code[MAX_CODE_LENGTH + 1];
} Code;
int get_freq(char *str, int freq[]) {
int len = strlen(str);
int i, idx, cnt = 0;
for (i = 0; i < len; i++) {
idx = str[i] - 'a';
if (freq[idx] == 0) cnt++;
freq[idx]++;
}
return cnt;
}
void init_tree(TreeNode *tree, int n) {
int i;
for (i = 0; i < n; i++) {
tree[i].weight = 0;
tree[i].parent = -1;
tree[i].left_child = -1;
tree[i].right_child = -1;
}
}
void build_tree(TreeNode *tree, int freq[], int n) {
int i, j, idx1, idx2, min1, min2;
for (i = 0; i < n - 1; i++) {
min1 = min2 = 0x7fffffff;
idx1 = idx2 = -1;
for (j = 0; j < n + i; j++) {
if (tree[j].parent == -1) {
if (tree[j].weight < min1) {
min2 = min1;
idx2 = idx1;
min1 = tree[j].weight;
idx1 = j;
} else if (tree[j].weight < min2) {
min2 = tree[j].weight;
idx2 = j;
}
}
}
tree[idx1].parent = n + i;
tree[idx2].parent = n + i;
tree[n + i].weight = min1 + min2;
tree[n + i].left_child = idx1;
tree[n + i].right_child = idx2;
}
}
void get_code(TreeNode *tree, Code code[], int n) {
int i, j, p, k;
char tmp[MAX_CODE_LENGTH + 1];
for (i = 0; i < n; i++) {
p = i;
k = 0;
while (tree[p].parent != -1) {
if (tree[tree[p].parent].left_child == p) {
tmp[k++] = '0';
} else {
tmp[k++] = '1';
}
p = tree[p].parent;
}
tmp[k] = '\0';
code[i].ch = i + 'a';
for (j = 0; j < k; j++) {
code[i].code[k - 1 - j] = tmp[j];
}
code[i].code[k] = '\0';
}
}
void encode(char *str, Code code[], int n, char *enc_str) {
int len = strlen(str);
int i, j, idx;
char *p = enc_str;
for (i = 0; i < len; i++) {
idx = str[i] - 'a';
for (j = 0; j < strlen(code[idx].code); j++) {
*p++ = code[idx].code[j];
}
}
*p = '\0';
}
void decode(char *enc_str, TreeNode *tree, int n, char *dec_str) {
int len = strlen(enc_str);
int i, p = 0;
for (i = 0; i < len; i++) {
if (enc_str[i] == '0') {
p = tree[p].left_child;
} else {
p = tree[p].right_child;
}
if (tree[p].left_child == -1 && tree[p].right_child == -1) {
*dec_str++ = p + 'a';
p = 0;
}
}
*dec_str = '\0';
}
int main() {
char str[1001], enc_str[1001], dec_str[1001];
int freq[MAX_CHAR_NUM];
TreeNode tree[MAX_TREE_NODE_NUM];
Code code[MAX_CHAR_NUM];
int n, i, j;
while (1) {
scanf("%s", str);
if (strcmp(str, "0") == 0) break;
n = get_freq(str, freq);
init_tree(tree, 2 * n - 1);
for (i = 0; i < n; i++) {
tree[i].weight = freq[i];
}
build_tree(tree, freq, n);
get_code(tree, code, n);
// 输出字符出现频率
for (i = 0; i < n; i++) {
if (freq[i] > 0) {
printf("%c:%d ", i + 'a', freq[i]);
}
}
printf("\n");
// 输出哈夫曼树的存储结构
for (i = 0; i < 2 * n - 1; i++) {
printf("%d %d %d %d\n", tree[i].weight, tree[i].parent, tree[i].left_child, tree[i].right_child);
}
// 输出编码
for (i = 0; i < n; i++) {
if (strlen(code[i].code) > 0) {
printf("%c:%s ", code[i].ch, code[i].code);
}
}
printf("\n");
// 对字符串进行编码
encode(str, code, n, enc_str);
printf("%s\n", enc_str);
// 对编码进行解码
decode(enc_str, tree, n, dec_str);
printf("%s\n", dec_str);
}
return 0;
}
```
描述 输入一串字符串,根据给定的字符串中字符出现的频率建立相应哈夫曼树,构造哈夫曼编码表,在此基础上可以对待压缩文件进行压缩(即编码),同时可以对压缩后的二进制编码文件进行解压(即译码)。 输入 多组数据,每组数据一行,为一个字符串(只考虑26个小写字母即可)。当输入字符串为“0”时,输入结束。 输出 每组数据输出2n+3行(n为输入串中字符类别的个数)。第一行为统计出来的字符出现频率(只输出存在的字符,格式为:字符:频度),每两组字符之间用一个空格分隔,字符按照ASCII码从小到大的顺序排列。第二行至第2n行为哈夫曼树的存储结构的终态(形如教材139页表5.2(b),一行当中的数据用空格分隔)。第2n+1行为每个字符的哈夫曼编码(只输出存在的字符,格式为:字符:编码),每两组字符之间用一个空格分隔,字符按照ASCII码从小到大的顺序排列。第2n+2行为编码后的字符串,第2n+3行为解码后的字符串(与输入的字符串相同)。 样例输入1 aaaaaaabbbbbccdddd aabccc 0 样例输出1 a:7 b:5 c:2 d:4 1 7 7 0 0 2 5 6 0 0 3 2 5 0 0 4 4 5 0 0 5 6 6 3 4 6 11 7 2 5 7 18 0 1 6 a:0 b:10 c:110 d:111 00000001010101010110110111111111111 aaaaaaabbbbbccdddd a:2 b:1 c:3 1 2 4 0 0 2 1 4 0 0 3 3 5 0 0 4 3 5 2 1 5 6 0 3 4 a:11 b:10 c:0 111110000 aabccc使用c语言写出完整的代码并加上注释,分析时间复杂度和空间复杂读
注:下面的代码中,为了方便,所有的变量和函数名都使用了英文,但是注释中为了更好的理解,部分变量和函数名使用了中文。
时间复杂度:O(nlogn),其中n为输入字符串的长度。因为哈夫曼树的构建需要对每个字符出现频率进行一次遍历,时间复杂度为O(n);而哈夫曼编码的生成需要在哈夫曼树上进行dfs,时间复杂度为O(nlogn);压缩和解压缩的时间复杂度都为O(n)。因此总的时间复杂度为O(nlogn)。
空间复杂度:O(n),其中n为输入字符串中不同字符的个数。因为需要存储每个字符的出现频率、哈夫曼编码和解压缩后的字符串,所以空间复杂度为O(n)。
代码如下:
阅读全文