1.任意进制转换(why sometimes it won't shift to Chinese?)
while(q!=0) { q = q / base; a[j]=trans(q%base); j--; }
an the trans function is a transition from number to char.(A~Z)will represent (10~35)if needed.
BUT in my code i put a flag for first not zero number.Only when start with not zero,will be output.So there is something wrong when you enter 0.So,I should take zero special.
if(number==0) cout<<"0"<<endl;
2.transfer ffff to 65535,and ffffffffffff is the limit.
well first time,i didn't thing about the limit cituation.I used int .but I should use long long.here's my code.
long long a; scanf("%X",&a); cout<<a<<endl;
Again ,01.
(装了一个输入法好了,以前都是用系统自带的输入法)
然后我用正常方法做了,用的是阿斯科码转换,不是switch,其中要注意的就是对每一位要乘以16的n次方,这个数我是用连乘,要注意也要用long long。
#include <iostream> #include <stdio.h> using namespace std; int trans( char a) { if(a>=48&&a<=57) { return a-48; } else // cout<<(int)a<<" "<<a-55; return a-55; } int main() { char a[20]; gets(a); long long out=0; int i=0; while(a[i]!='\0') { i++; } i--; long long j=1; for(;i>=0;i--) { out = out + trans(a[i]) * j; j = j * 16; } cout<<out<<endl; return 0; }
还可以用
bits[count]=(n%p-10)+'A';这种公式,用10去换A,实质也是阿斯科码。
bits[count]=n%p+'0';小于A时。bits存的是char
3.规模在100000的16进制转换为8进制
3.1首先呢,我现在用的是codeblocks,codeblocks使用的minGW沿用linux习惯,strlen声明放在 string.h 中(linux系统中可以通过man strlen来查看其帮助和所在头文件),仅仅 #include <string> 只是引入了 std::string,还需要 #include <string.h>来自百度,所以我用的strlen()编译不通过。
gets(*char)前用cin,scanf都不能正确输入十六进制的字符串,所以我换成了cin输入16进制数组。
3.2有个问题就是大数组,由于本题要求一起输出,所以要设置个二维数组存储转换完成的数,只能动态申请然后别忘了动态释放,而且二维数组请看“:
http://www.cnblogs.com/irvinow/archive/2009/02/21/1395340.html
http://blog.csdn.net/promotercx/article/details/7564562
3.3我选择利用二进制做中间的转化,十六进制正好四位,八进制每次取三位。
3.4由此要注意,八进制要从低位开始转换,并且有可能不是三的倍数,剩余的两位或者一位需要单独处理。
3.5本题要求输出时不带前面的零比防说1(十六)->0001(二)->01(八),我用了一个flag记录有没有遇到非零的数字,但是此时注意需要在每输出一行就要重置flag回false
3.6我直接用bitset把十六进制转换成二进制的。
还有0单独处理,上面提到过。
这道题细节真多啊,虽然本身算法不难,可是代码起来总出错。最麻烦的就是它的规模。至于别人的代码由于不能直接复制粘贴看是否能运行,所以我也没看有没有更简洁的方法,很多回复的代码都是不能ac的。
我的代码放下面仅供参考:
#include <iostream>
#include <bitset>
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
int main()
{
char six[100003];
short **eight;
eight=new short *[11];
int len[11];
for(int i=0; i<=10; i++)
{
eight[i]=new short [400000];
}
bool two[400009];
int m=0;
scanf("%d",&m);
for(int o=0; o<m; o++)
{
//gets(six);
cin>>six;
if(six[0]=='0'&&six[1]=='\0')
cout<<0;
int n = strlen(six);
int k = 0;
for(int i=0; i<n; i++)
{
int r=0;
if(six[i]>=65)
r=six[i]-55;
else
{
r=six[i]-48;
// cout<<(int)six[i]<<" ";
// cout<<r<<" "<<six[i]-48<<" ";
}
bitset<4>b(r);
// cout<<b;
// cout<<b[0]<<b[1]<<b[2]<<b[3]<<endl;
for(int j=3; j>=0; j--)
{
two[k]=b[j];
// cout<<b[j];
k++;
}
}
int j=0;
int i;
// cout<<k;
for(i=k-1; i>=2; i=i-3)
{
// cout<<two[i]<<two[i-1]<<two[i-2];
eight[o][j]=two[i] + two[i-1] * 2 + two[i-2]*4;
j++;
// cout<<i<<endl;
// cout<<eight[j];
}
if(i==1)
{
eight[o][j]=two[i]+two[i-1]*2;
j++;
}
else if(i==0)
{
eight[o][j]=two[i];
j++;
}
// cout<<j;
len[o]=j;
}
bool flag;
flag=false;
int u=0;
for(int o=0; o<m; o++)
{
for(int p=len[o]-1; p>=u; p--)
{
if(eight[o][p]!=0&&flag==false)
flag=true;
if(flag==true)
cout<<eight[o][p];
}
flag=false;
cout<<endl;
}
for(int i=0; i<=10; i++)
{
delete []eight[i];
}
return 0;
}