输入16进制16 ff 10
就会出现如上问题。应该是字符串问题。不过为什么?
#include<stdio.h>
#include<string.h>
char z[17]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int main(){
int a,b;
char n[50]={};
while(scanf("%d%s%d",&a,n,&b)!=EOF){
int product=1;
int len=strlen(n);//上面N数组长度已定义。
int anum[len]={1,2,3},i,j;
printf("len=%d\n",len);
for(i=0;i<3;i++){
j=15;
while(j>=0){
if(n[i]==z[j]){
anum[i]=j;
printf("%d\n",anum[i]);
break;
}
else j--;
}
}//把字符串转换成整型数组
printf("n[2]=%d\n",n[2]);
printf("anum[0]=%d\n",anum[0]);
printf("anum[1]=%d\n",anum[1]);
printf("anum[2]=%d\n",anum[2]);
for(i=0;i<len;i++){
printf("%d",anum[i]);
}
printf("\n");
long long int y=0;
while(len--){
y+=anum[len]*product;
product*=a;
}//转换为10进制数
printf("y=%d\n",y);
int bnum[50]={0};
i=0,j=0;
do{
bnum[i++]=y%b;
y/=b;
}while(y!=0);//转换为b进制数字字符串
len=i;
for(i=0;i<len;i++){
printf("%d ",bnum[i]);
}
printf("\n");
char b[50];
for(i=0;i<len;i++){
b[i]=z[bnum[i]];
}
b[i]='\0';//转换为b进制字符串
for(i=len-1;i>=0;i--){
printf("%c",b[i]);
}
printf("\n");
}
return 0;
}
问题在于已定义n[50],后面又求长度strlen,所以我写了个函数来求长度,但Oj仍然没法通过。
#include<stdio.h>
#include<string.h>
char z[17]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int nlen(char n[]){
int len=strlen(n);
return len;
}
int main(){
int a,b;
char n[50]={};
while(scanf("%d%s%d",&a,n,&b)!=EOF){
int product=1;
int len=nlen(n);
int anum[len]={},i,j;
//printf("len=%d\n",len);
for(i=0;i<3;i++){
j=15;
while(j>=0){
if(n[i]==z[j]){
anum[i]=j;
//printf("%d\n",anum[i]);
break;
}
else j--;
}
}//把字符串转换成整型数组
/*printf("n[2]=%d\n",n[2]);
printf("anum[0]=%d\n",anum[0]);
printf("anum[1]=%d\n",anum[1]);
printf("anum[2]=%d\n",anum[2]);
for(i=0;i<len;i++){
printf("%d",anum[i]);
}
printf("\n");
*/
long long int y=0;
while(len--){
y+=anum[len]*product;
product*=a;
}//转换为10进制数
//printf("y=%d\n",y);
int bnum[50]={0};
i=0,j=0;
do{
bnum[i++]=y%b;
y/=b;
}while(y!=0);//转换为b进制数字字符串
len=i;
/*for(i=0;i<len;i++){
printf("%d ",bnum[i]);
}
printf("\n");*/
char b[50];
for(i=0;i<len;i++){
b[i]=z[bnum[i]];
}
b[i]='\0';//转换为b进制字符串
for(i=len-1;i>=0;i--){
printf("%c",b[i]);
}
printf("\n");
}
return 0;
}
正确代码:memcoy0
人家直接‘9’-‘0’,‘f’-‘a’+10;这样来计算值。和我方法不一样。
#include <cstdio>
#include <cstring>
int CharToOct(int a, char n[]) { //按进制a将n字符串(可表示2-16进制)转换为10进制数
int sum = 0, product = 1;
for (int i = strlen(n) - 1; i >= 0; i--) {
if (n[i] <= '9') sum += (n[i] - '0') * product;
else if (n[i] <= 'F') sum += (n[i] - 'A' + 10) * product; //大写字母符号
else if (n[i] <= 'f') sum += (n[i] - 'a' + 10) * product; //小写字母符号
product *= a;
}
return sum;
}
void OctToChar(int temp, int b, char r[]) { //将10进制数按b进制转换成r字符串
int i = 0;
do {
int k = temp % b;
if (k <= 9) r[i++] = '0' + k; //十进制符号
else r[i++] = 'A' + k - 10; //用大写字母表示大于9的数字
temp /= b;
} while (temp != 0);
r[i] = '\0'; //必须添加结束符, 不然strlen无法正确判别长度
}
int main() {
int a, b; // 2-16
char n[100];
while (scanf("%d%s%d", &a, n, &b) != EOF) {
int temp = CharToOct(a, n);
if (b == 10) {
printf("%d\n", temp);
continue;
}
char r[100];
OctToChar(temp, b, r);
for (int j = strlen(r) - 1; j >= 0; j--)
printf("%c", r[j]);
printf("\n");
}
return 0;
}