2021.12.5 学习总结

这两周学习了太多东西,有点杂,记得比忘得快,今天抽空总结一下。

测试卡在第二道题上暴力拆了半天,导致括号匹配和a都没写完,很难过,感觉自己好拉,有点被自己废物到。

关于进制转换:

任意进制转化为十进制:

#include <stdio.h>
int main(){
	int x,p;   //x输入数字  p该数的进制数  
	scanf("%d",&x);
	scanf("%d",&p);
	int y=0,product=1;
	while(x!=0){
		y=y+(x%10)*product;
		x=x/10;
		product=product*p;
	}
	printf("%d",y);
	return 0;
} 

 十进制转化为任意进制:

#include <stdio.h>
int main(){
	int x,p; //x为十进制数,p为目标进制大小 
	scanf("%d",&x);
	scanf("%d",&p);
	int a[100]; //存放余数 
	int count=0;
	do{
		a[count++]=x%p;
		x=x/p;
	}while(x!=0);//当商不为0时进行循环 
	
	for(int i=count-1;i>=0;i--){
		printf("%d",a[i]);
	}
} 

注意:这里只能用do...while(原因:如果输入的是0,那么我们希望a[0]=0)

 二进制转化为十六进制

主要思路:确定十六进制数组大小->确定二进制数数组大小->二进制每过4位存入十六进制1位

思路:输入的二进制数可能能不是4的整数倍,那么我们该如何处理呢?我们知道二进制不够4位,用0占位。于是我先将输入的二进制数除以10000取余(看4位),这样就确定十六进制数组的大小,反过*4来就知道了二进制数的大小。

#include <stdio.h>
#include <math.h>
int main(){
	//输入2进制数 
	int x;
	scanf("%d",&x); 
	
	//确定:16进制数组大小size与2进制数组大小size*4.
	int X=x;
	int size=0; 
	while(true){
		if(X%10000!=0){ //采取看4位二进制的方法 
			size++;
			X=X/10000;
		}else{
			break;
		} 
	}
	char tt[size];   //16进制数数组 
	int t[size*4]; //2进制数数组 
      //存入 
	int sum=0;
	int count=0;
	for(int i=0;i<sizeof(t)/sizeof(int);i++){
		t[i]=x%10;
		x=x/10;
		sum=sum+t[i]*pow(2,count);
		count++;
		if(count%4==0){
			if(sum>=10){
				tt[--size]=65+(sum-10);  //字符'A'的ASCII码为65 
			}else{
				tt[--size]='0'+sum;    
			}
			count=0;
			sum=0;
		}	
	}
	for(int i=0;i<sizeof(tt);i++){
		printf("%c",tt[i]);
	}
	return 0;
} 

下面是一道菜鸟杯的题目用到了进制转换:

问题 G: 存钱

描述

牛子爷赚了钱想存进T银行,但是T银行是7进制银行,里面的存款都是用7进制显示的.
牛子爷每次存完钱之后,不知道自己现在在银行的存款是多少
因为他不会10进制转换成7进制。
聪明的你,能帮帮牛子爷嘛?

格式

输入格式

输入一个数T代表有T组测试样例(1<=t<=1000)
第一行是两个正整数n,m(n代表牛子爷存这笔钱之前在T银行的存款(牛子爷在上次在T银行存款时看的),m代表牛子爷要存的钱的数量)
(0<=n<=10^6,0<=m<=10^6)


注意  n是7进制的数,m是10进制的数

输出格式

牛子爷在存完这笔钱之后在T银行的存款

样例

样例输入 Copy

2
10 7
6 10

样例输出 Copy

20
22		

提示

在T银行的存款都是用7进制显示
10元存进T银行,你在T银行的存款会加上13(10转换成7进制是13)
牛子爷要存的钱是10进制数

 

#include<stdio.h>
int a[1*10^6+10];
int main()
{
    int u;
    long long int n,m,i;
    scanf("%d",&u);
    while(u--)
    {
        long long int k=0,p=1,sum=0; //k是七进制转化为十进制时的数
        scanf("%lld%lld",&n,&m); //n为七进制存款,m为十进制要存的数量
        while(n!=0)
        {
            k = k + (n % 10) * p; //从最低位开始,将每个位上的数提取出来,乘以7的(位数-1)次方,求和
            n = n / 10;
            p = p*7;
        }
        sum = k + m;
        int count=0;
        do{
            a[count++] = sum % 7;
            sum = sum / 7;
        }while(sum!=0);

        for(i=count-1; i>=0; i--)
        {
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值