ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[万人千题计划] 《C语言入门100例》(第21例) 进制转换——4个习题

2021-11-22 15:32:14  阅读:165  来源: 互联网

标签:10 进制 int sum C语言 num ans 习题 21


文章目录

文章目录

零、写在前面

一、习题1

(1)题目

(2)解题

(3)结果

二、习题2

(1)题目

(2)解题

(3)结果

三、习题3

(1)题目

(2)解题

(3)结果

四、习题4

(1)题目

(2)解题

(3)结果


零、写在前面

英雄哪里出来《算法零基础100讲》传送门

https://bbs.csdn.net/forums/hero?category=0&typeId=17913icon-default.png?t=LA92https://bbs.csdn.net/forums/hero?category=0&typeId=17913本题知识回顾

本章主要描述了10进制数如何变为任意的k进制数

【第21题】给定一个十进制数 d 和一个进制 X,求它的 X 进制表示_英雄哪里出来-CSDN博客难度:★★☆☆☆,进制转换https://blog.csdn.net/WhereIsHeroFrom/article/details/118272707

每天会开启一篇试读文章,每日坚持打卡就可以一直白嫖哦

一、习题1

(1)题目

1837. K 进制表示下的各位数字总和

难度简单13

给你一个整数 n10 进制)和一个基数 k ,请你将 n 从 10 进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和 。

转换后,各位数字应当视作是 10 进制数字,且它们的总和也应当按 10 进制表示返回。

示例 1:

输入:n = 34, k = 6 输出:9 解释:34 (10 进制) 在 6 进制下表示为 54 。5 + 4 = 9 。

提示:

  • 1 <= n <= 100
  • 2 <= k <= 10

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/sum-of-digits-in-base-k/

(2)解题

思路:通过除留余数法,算出k进制的每一位,加到一起

int sumBase(int n, int k){//十进制数n和k进制
    int sum=0;    //定义变量,记录和
    while(n){ //循环,当n/=k为零,即求余结束,结束
        sum+=n%k;  //逐位加上余数
        n/=k;      //n除以k,之后继续循环
    }
    return sum;  //返回结果
}

(3)结果

 

二、习题2

(1)题目

1399. 统计最大组的数目

难度简单21

给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。

请你统计每个组中的数字数目,并返回数字数目并列最多的组有多少个。

示例 1:

输入:n = 13   输出:4
解释:总共有 9 个组,将 1 到 13 按数位求和后这些组分别是:
[1,10],[2,11],[3,12],[4,13],[5],[6],[7],[8],[9]。总共有 4 个组拥有的数字并列最多。

提示:

  • 1 <= n <= 10^4

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/count-largest-group/

(2)解题

思路:先求位数和sum,用sum作为下标,当sum的值多次相等时,以sum为下标的数组就会++多次,从而记录,每个sum出现的次数,然后找最多的次数maxn,最后看有几个sum相同都出现了maxn,即为所求答案

int countLargestGroup(int n){
    int has[37] = {0};  //定义并初始化数组为0,大小为n取9999是位数和4*9=36,0-36,共37个
    int sum = 0,num = 0;  //sum表示位数和,num表示过度的数
    for(int i=1;i<=n;i++){          
        if(i>=10){    //大于10求余计算                  
            num = i;               
            while(num>0){
                sum += num % 10;
                num = num / 10;     //通过求余计算出n的每一位,并求和
            }
            has[sum]++;  //用和作为下标,这样当sum出现相等的情况has就会++两次
            sum = 0;   //归零sum,继续循环
        }
        else{      //小于10,直接记就好了啊
            has[i]++;
        }
    }

    int maxn = -1,ans = 0;
    for(int i=1;i<=36;i++){
        maxn = has[i]>maxn?has[i]:maxn;  //求最大的has,即和相等的数最多为几
    }
    for(int i=1;i<=36;i++){   //求最多相等和数,共有几组
        if(maxn == has[i])
            ans++;
    }
    return ans;     //返回结果
}

(3)结果

 

三、习题3

(1)题目

504. 七进制数

难度简单103

给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

示例 1:

输入: num = 100 输出: "202"

提示:

  • -107 <= num <= 107

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/base-7/

(2)解题

思路:通过除留余数法,算出k进制的每一位,存储到ans中,判断数的正负,加在ans最后边,然后加结束符,因为存进ans时最后一位存在了ans[0],所以是反着存的,左后取反一下,就是结果。

void reverse(char *s){   //把字符串反过来
    int i,len=strlen(s);  //strlen()求字符串长度
    char t;   //用来过度
    for(i=0;i<len/2;i++){  //反转
        t=s[i];
        s[i]=s[len-1-i];
        s[len-1-i]=t;
    }
}
char * convertToBase7(int num){
char *ans=(char*)malloc(sizeof(char)*1000);  //申请存储空间,大小就取大点,够用就行
if(num==0){   //0的时候
    ans[0]='0';
    ans[1]='\0';
    return ans;
}
int flag=1,k=0;  //表示正负flag
if(num<0)
{
    flag=0;
    num=-num;
}
while(num)
{
    ans[k++]=num%7+'0';   //通过求余求7进制的每一位,存在ans中
    num/=7;
}
ans[k]='\0';  //最后的k++,先使用再自增,所以随后一ans[k]没赋值,在这加一个结束符
if(flag==0)
    ans[k]='-';  //通过之前的flag判断正负,负数,就在最后加个-号
    ans[k+1]='\0';
reverse(ans);   //取反
return ans;   //返回结果
}

(3)结果

 

四、习题4

(1)题目

405. 数字转换为十六进制数

难度简单214

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

  1. 十六进制中所有字母(a-f)都必须是小写。
  2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 
  3. 给定的数确保在32位有符号整数范围内。
  4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

示例 1:            示例 2:     

输入:          输入:
26              -1

输出:          输出: 
"1a"          "ffffffff"     

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/

(2)解题

思路:不会,抄的

char * toHex(int num){
    char c[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; //16进制
    char * ans;    //定义数组
    ans=(char *)malloc(sizeof(char)*9);   //申请存储空间
    for(int i=7;i>=0;--i){
        ans[i]=c[num&0xF];//每位16进制    //不会,没明白,抄的充个数
        num=num>>4;
    }
    ans[8]='\0';
    while(ans[0]=='0'&&*(ans+1)!='\0'){  //剔除前缀0
        ans=ans+1;   //这个就是把ans的头像右挪一位
    }
    
    return ans;     //返回结果  
}

(3)结果

 

标签:10,进制,int,sum,C语言,num,ans,习题,21
来源: https://blog.csdn.net/weixin_51966740/article/details/121469325

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有