非科班,一直都是自己的野路子,现在要回炉重造
十进制->二进制
基本思想:
开始写的(80%):
#include<stdio.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int a[10];
int i=0;
do
{
a[i++]=n%2;
n/=2;
}while(n!=0);
for (int j=i-1;j>=0;j--)
printf("%d",a[j]);
}
1024=2^10,需要a[11]
把a[10]改成a[11](100%)
#include<stdio.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int a[11];
int i=0;
do
{
a[i++]=n%2;
n/=2;
}while(n!=0);
for (int j=i-1;j>=0;j--)
printf("%d",a[j]);
}
十进制->k进制:
注意:
可能会是字母!
#include<stdio.h>
using namespace std;
int main(){
int n,k;
char a[11];
char b[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
scanf("%d %d",&n,&k);
int i=0;
do
{
a[i++]=b[n%k];
n/=k;
}while(n!=0);
for (int j=i-1;j>=0;j--)
printf("%c",a[j]);}
上面的做法太蠢了。输出端可用if (数字)else(字母);
再加上字符串是连着的,printf("%c",'A'+1)等于printf("%c",'B');
所以可以
for (int i = len - 1; i >= 0; i--) {
if (radixK[i] <= 9) {
printf("%d", radixK[i]);
} else {
printf("%c", radixK[i] - 10 + 'A');
}
}
注意:char的输出用%c,不能用%s。
2进制转十进制
思路
k进制转10进制
Q1:如何接受输入?
Q2:如何知道输入长度?
A2:一个一个字符char的接受赋值给c[i];i++
A1:看i
我写的(ac)
#include<stdio.h>
#include<string>
using namespace std;
int main(){
char c[8];
char input1;
int c2[8];
int ci2=0;
int i=0;
int k;
do
{
scanf("%c",&input1);
if (input1>='0' && input1<='9')
c2[i++]=input1-'0';
else
{
if (input1>='A' && input1<='F')
c2[i++]=input1-'A'+10;
}
}while(input1!=' ');
scanf("%d",&k);
//printf("%d",k);
int ans=0;
for (int j=0;j<i;j++)
{
//printf("%d",c2[j]);
ans=ans*k+c2[j];
//printf("--%d--",ans);
}
printf("%d",ans);
}
我的代码有个bug,就是输入只能用空格隔开,一旦用回车,就会出错
当然下面这位也是 ,但下面这位可以修改
标准答案:
#include <cstdio>
#include <cstring>
const int MAXN = 8;
char radixK[MAXN];
int main() {
int k;
scanf("%s %d", radixK, &k);
int radix10 = 0, base = 1, lenRadixK = strlen(radixK);
for (int i = lenRadixK - 1; i >= 0; i--) {
int thisPosition = (radixK[i] >= '0' && radixK[i] <= '9') ? (radixK[i] - '0') : (radixK[i] - 'A' + 10);
radix10 += thisPosition * base;
base *= k;
}
printf("%d", radix10);
return 0;
}
·A1:【include cstring】使用了cstring,与%d用空格隔开
A2:strlen获取字符串长度