这两周学习了太多东西,有点杂,记得比忘得快,今天抽空总结一下。
测试卡在第二道题上暴力拆了半天,导致括号匹配和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;
}