8 条题解
-
5
好久没有做题啦~今天上来就是一道进制转换(看到最后有彩蛋)看了一下范围,是 18 位数,可以用 long long 形式来写,看看思路吧!
- 首先定义一个函数 calculate 函数来转换进制
- 然后一定一定要定义一个 char型数组来存储从 0开始到16在16进制中对应的数字,这样就可以用 num[数字]来查找啦~(索引刚刚好)
- 然后就是一次一次的耗 long long 型的 n,每一次都进行取余并且查找数字,并且将长度加一
- 最后万万不可忘记的是:要倒叙输出哦~
好了,上代码吧~(AC代码,保准通行!)
#include <bits/stdc++.h> using namespace std; char a[100000]; void calculate(long long n, int k, int s) { char num[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; while (n > 0) { a[s] = num[n % k]; n /= k; s += 1; } } int main() { long long x; memset(a, 0, sizeof(a)); cin >> x; if (x == 0) cout << 0 << endl; else { calculate(x, 16, 0); int lena = strlen(a); for (int i = lena - 1; i >= 0; i--) cout << a[i]; } return 0; }
啥?你居然还在?看来你是铁粉,来看看彩蛋吧,但是这个转换进制的机制有几个条件请你务必要记住(否则,错了别来找我呀……)
- 务必要把数组 a 先全部都设为 0(数字的)
- 务必要确定是否可以用 long long 型来做,如果数字过大,那就不能用这个函数了
最后来看看 calculate() 函数吧~~~~~~~
void calculate(long long n, int k, int s) { char num[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; while (n > 0) { a[s] = num[n % k]; n /= k; s += 1; } }
-
4
😄 一种字符串的写法如下: 十进制转R进制就是“除R取余法”(短除法),用来拆出10进制n的每一位。
char a[7] = {0, 'A', 'B', 'C', 'D', 'E', 'F'}; long long n, x; string s; char c; cin >> n; // 下面是通用的除 R倒着取余的过程 while (n != 0) { x = n % 16; if (x + '0' <= '9') { c = x + '0'; } // 这里由于16进制的缘故多操作了一步 else { c = x + 'A' - 10; } s = c + s; n = n / 16; } if (s == "") { cout << 0; }// 不要忘记判 0哦 else { cout << s; }
-
3
思路: 应为是16进制,出现字母,不能用常规做法,得换个思路; 首先因为出现字母,必须用char或string,这里我用char方便一点,我算了一下,可以开大于16的所有数,毕竟char只占一字节,开个50也没问题哈; 然后为了方便一些,何不用switch...case...default语句呢? 完整代码:(已AC)
#include <bits/stdc++.h> using namespace std; int main(){ long long n; int x=0,f; char c[50]; cin>>n; if(n==0){ cout<<0<<endl; return 0; } while(n>0){ f=n%16,n/=16; switch(f){ case 10:c[++x]='A';break; case 11:c[++x]='B';break; case 12:c[++x]='C';break; case 13:c[++x]='D';break; case 14:c[++x]='E';break; case 15:c[++x]='F';break; default:c[++x]='0'+f;break; } } for(int i=x;i>=1;i--)cout<<c[i]; return 0; }
格式化:
#include <iostream> using namespace std; int main(){ long long n; int x=0,f; char c[50]; bool flag=true; cin>>n; while(n>0) { f=n%16; switch(f) { case 10:c[++x]='A';break; case 11:c[++x]='B';break; case 12:c[++x]='C';break; case 13:c[++x]='D';break; case 14:c[++x]='E';break; case 15:c[++x]='F';break; default:c[++x]='0'+f;break; } n/=16; flag=false; } if(flag) { cout<<0<endl; } else { for(int i=x;i>=1;i--) { cout<<c[i]; } } return 0; }
-
3
int long long n ,a[1000000],s=1; cin>>n; while(n>16) { a[s]=n%16; n/=16; s++; } a[s]=n; for(int i=s;i>=1;i--) { if(a[i]==10) cout<<'A'; else if(a[i]==11) cout<<'B'; else if(a[i]==12) cout<<'C'; else if(a[i]==13) cout<<'D'; else if(a[i]==14) cout<<'E'; else if(a[i]==15) cout<<'F'; else cout<<a[i]; }
-
2
#include <iostream> using namespace std; char b[7]={'A','B','C','D','E','F'}; int main() { long long n; int cnt=0,a[25]; cin >> n; if (n==0) { cout << n; return 0; } while(n>0) { a[++cnt]=n%16; n/=16; } for (int i=cnt;i>0;i--) { if (a[i]>=10) { cout << b[a[i]-10]; } else { cout << a[i]; } } return 0; }
-
1
又来做题拉(最后有彩蛋~~) 1.定义一个num'1'~'F'
2.把上一题的while循环ctrl+c ctrl+v过来(稍微改亿下)
3.逆序输出
重点来啦 先判断输入是否为0,如果是输出0 else循环输出(别问我是怎末知道的,说多了都是泪😕) 来康康代码
char a[1000],num[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; if(n==0) cout<<0; else{ while (n>0){ a[s]=num[n%16]; n/=16; s++; } for(int j=s-1;j>=0;j--) cout<<a[j]; } --- 彩蛋来咯 附赠可直接复制代码//老师应该啥也么康见😄
#include <bits/stdc++.h> using namespace std; int main(){ long long n,s=0; cin>>n; char a[1000],num[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; if(n==0) cout<<0; else{ while (n>0){ a[s]=num[n%16]; n/=16; s++; } for(int j=s-1;j>=0;j--) cout<<a[j]; } return 0; }
- 1
信息
- ID
- 286
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 6
- 标签
- 递交数
- 786
- 已通过
- 216
- 上传者