进制转换中1的个数--E

本文介绍了一个C语言程序,该程序能够帮助用户统计在一个特定进制下,给定数值中数字1出现的次数。通过不断除以进制基数并检查余数是否为1来实现。

NowCoder总是力争上游,凡事都要拿第一,所以他对“1”这个数情有独钟。爱屋及乌,他也很喜欢包含1的数,例如10、11、12……。不仅如此,他同样喜欢任意进制中包含1的数。当然,其中包含1的个数越多他越喜欢。你能帮他统计一下某个数在特定的进制下1的个数吗?

#include <stdio.h>
 
int main()
{
    int N,r;
    int count;
    while((scanf("%d %d",&N,&r))!=EOF){
        count=0;
        while(1){
            if(N%r==1){
                count++;
            }
            N/=r;
            if(!N)
                break;
        }
        printf("%d\n",count);
    }
    return 0;
}


以下是一个使用 Shell 脚本实现的解决方案,用于**统计文件中每一行中十六进制数的个数**。该脚本会读取一个文本文件,逐行分析,并统计每行中符合十六进制格式(默认以 `0x` 开头)的数字个数--- ### ✅ 示例脚本: ```bash #!/bin/bash # 检查是否传入了文件名 if [ $# -ne 1 ]; then echo "Usage: $0 <filename>" exit 1 fi filename="$1" # 检查文件是否存在 if [ ! -f "$filename" ]; then echo "File $filename does not exist." exit 1 fi line_number=0 # 逐行读取文件内容 while IFS= read -r line; do line_number=$((line_number + 1)) # 提取所有以 0x 开头的十六进制数 hex_numbers=$(echo "$line" | grep -oE '0x[0-9a-fA-F]+' | tr '[:lower:]' '[:upper:]') # 统计个数 count=0 for hex in $hex_numbers; do count=$((count + 1)) done echo "Line $line_number: $count hexadecimal numbers" done < "$filename" ``` --- ### 🧠 脚本解释: 1. **参数检查**: - `if [ $# -ne 1 ]`:确保用户传入了一个文件名。 - 如果没有传入,则提示使用方式并退出。 2. **文件存在性检查**: - `if [ ! -f "$filename" ]`:检查文件是否存在。 - 若不存在则报错退出。 3. **逐行读取与处理**: - 使用 `while IFS= read -r line` 安全地逐行读取文件。 - 使用 `grep -oE '0x[0-9a-fA-F]+'` 提取所有以 `0x` 开头的十六进制数。 - `-o` 表示只输出匹配部分。 - `-E` 表示启用扩展正则表达式。 - `tr '[:lower:]' '[:upper:]'`:将所有小写字母转换为大写,统一格式(非必须,但便于处理)。 4. **统计十六进制数个数**: - 将提取出的十六进制数循环遍历,使用 `count` 变量累加数量。 5. **输出每行统计结果**: - 输出每行的行号和对应的十六进制数个数--- ### 📄 示例输入文件 `input.txt`: ``` This line has 0x10 and 0x20. Another line with 0xA, 0xB and 0xC. 0x1 0x2 0x3 Empty line ``` ### ✅ 示例输出: ``` Line 1: 2 hexadecimal numbers Line 2: 3 hexadecimal numbers Line 3: 3 hexadecimal numbers Line 4: 0 hexadecimal numbers ``` --- ### 🔍 注意事项: - 默认识别以 `0x` 开头的十六进制数。 - 如果你的十六进制数不带 `0x` 前缀,可以将正则表达式改为 `[0-9a-fA-F]\{1,\}`。 - 如果希望忽略非十六进制的单词,可以使用更严格的正则表达式,如 `\<0x[0-9a-fA-F]\+\>`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值