一个16进制转8进制的程序

黑暗小车 2019-02-09 09:07:55
#include<stdio.h> #include<string.h> int change(char a) { if(a<58) { return (a-48); } else { return (a-55); } } int change1()//16 zhuan 8 { char a[6]; scanf("%s",a); int b[24],k,i,j,sum=0,mark; k=strlen(a); for(j=0;j<k;j++)//16 zhuan 2 { int c; c=change(a[j]); for(i=j*4+3;i>=j*4;i--) { b[i]=c%2; c=c/2; } } mark=3-(k*4)%3; for(i=0;i<k*4;i=i+3)//2 zhuan 8 { if(mark==2) { i=i-2; sum=sum*10+b[i+2]; mark=mark-2; } else if(mark==1) { i=i-1; sum=sum*10+b[i+1]*2+b[i+2]; mark--; } else { sum=sum*10+b[i]*4+b[i+1]*2+b[i+2]; } } return (sum); } int main() { int n,i; scanf("%d",&n); int b[n]; for(i=0;i<n;i++) { b[i]=change1(); } for(i=0;i<n;i++) { printf("%d\n",b[i]); } return (0); }
...全文
364 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑暗小车 2019-02-19
  • 打赏
  • 举报
回复
谢谢你了,我刚刚入csdn许多地方不懂,有不对希望别见怪
lin5161678 2019-02-12
  • 打赏
  • 举报
回复
引用 7 楼 晗生缘 的回复:
楼主您好,您的2进制转为8进制的代码有的瑕疵。建议您先将16进制转为10进制,由10进制转为8进制。
/*将一个大写字母转换成小写字母*/
int tolower(char c)
{
if (c >= 'A'&&c <= 'Z')
{
c = c + 'a' - 'A';
}
return c;
}
/*将一个16进制的字符串改成整数*/
int htoi(char str[])
{
int i;
int n=0;
if (str[0] == '0'&&(str[1] == 'x' || str[1] == 'X'))
{
i = 2;
}
else
{
i = 0;
}
for (; (str[i] >= '0'&&str[i] <= '9') || (str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z'); i++)
{
if (tolower(str[i]) > '9')
{
n = 16 * n + (10 + tolower(str[i]) - 'a');
}
else
{
n = 16 * n + (tolower(str[i])-'0');
}
}
return n;
}
/*将整数转换成8进制数*/
char *itoo(int Num, char buf[])
{
int i = 0;
int j;
char temp;
while (Num != 0)
{
buf[i++] = Num % 8 + '0';
Num = Num / 8;
}
for (j = 0; j < (i / 2); j++)
{
temp = buf[j];
buf[j] = buf[i - j - 1];
buf[i - j - 1] = temp;
}
return buf;
}
/*将16进制转换为8进制*/
char *htoo(char buf[])
{
int n;
char *p = NULL;
n = htoi(buf);
p = itoo(n, buf);
return buf;
}
int main()
{
char str[N];
char n[N];
int i=0,len;
char *p = NULL;
printf("Please input:\n");
scanf("%s",str);
p=htoo(str);
for (i = 0; i < N; i++)
{
printf("%c\t",str[i]);
}
system("pause");
return 0;
}
十六进制转八进制
需要注意 这题目的数值非常大远远超过int取值范围
你的想法是错误的

这题目的基本思路不应该借助十进制做中转
应该借助二进制做中转

一位十六进制 转换为 四位二进制
一位八进制 转换成 三位二进制
所以 三位十六进制 能转换成 四位八进制
按照这个思路 把字符串按照三位一组进行分组
每次转换出四位八进制存到一个字符串里面
最后输出字符串就好了
晗生缘 2019-02-12
  • 打赏
  • 举报
回复
楼主您好,您的2进制转为8进制的代码有的瑕疵。建议您先将16进制转为10进制,由10进制转为8进制。 /*将一个大写字母转换成小写字母*/ int tolower(char c) { if (c >= 'A'&&c <= 'Z') { c = c + 'a' - 'A'; } return c; } /*将一个16进制的字符串改成整数*/ int htoi(char str[]) { int i; int n=0; if (str[0] == '0'&&(str[1] == 'x' || str[1] == 'X')) { i = 2; } else { i = 0; } for (; (str[i] >= '0'&&str[i] <= '9') || (str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z'); i++) { if (tolower(str[i]) > '9') { n = 16 * n + (10 + tolower(str[i]) - 'a'); } else { n = 16 * n + (tolower(str[i])-'0'); } } return n; } /*将整数转换成8进制数*/ char *itoo(int Num, char buf[]) { int i = 0; int j; char temp; while (Num != 0) { buf[i++] = Num % 8 + '0'; Num = Num / 8; } for (j = 0; j < (i / 2); j++) { temp = buf[j]; buf[j] = buf[i - j - 1]; buf[i - j - 1] = temp; } return buf; } /*将16进制转换为8进制*/ char *htoo(char buf[]) { int n; char *p = NULL; n = htoi(buf); p = itoo(n, buf); return buf; } int main() { char str[N]; char n[N]; int i=0,len; char *p = NULL; printf("Please input:\n"); scanf("%s",str); p=htoo(str); for (i = 0; i < N; i++) { printf("%c\t",str[i]); } system("pause"); return 0; }
lin5161678 2019-02-11
  • 打赏
  • 举报
回复
比如输入
1
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
你的代码就错了
lin5161678 2019-02-11
  • 打赏
  • 举报
回复
每个十六进制数长度不超过100000

你的数组太小了
  • 打赏
  • 举报
回复
简单写一个:

#include <stdio.h>
#include <string.h>

char b[100001], c[9];
char t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,0,0,0,0,0,0, 10, 11, 12, 13, 14, 15};

int main()
{
int n, i, p, q, r, x;

scanf("%d", &n);
while (n--)
{
scanf("%s", b);
q = (p = strlen(b)) / 6, (r = p % 6) ? r : (q--, r = 6);
for (x = 0, i = r; i; i--) x += t[b[i - 1] - 48] * (1 << (r - i) * 4);
for (p = 8; x; x >>= 3) c[--p] = (x & 7) + 48;
printf("%s", &c[p]);
for (x = 0, p = 0; p < q; p++)
{
for (i = 0; i < 6; i++) x += t[b[p * 6 + r + i] - 48] * (1 << (5 - i) * 4);
for (i = 7; i >= 0; i--) c[i] = (x & 7) + 48, x >>= 3;
printf("%s", c);
}
puts("");
}

return 0;
}

耕者走兔 2019-02-10
  • 打赏
  • 举报
回复
看上去你使用大量c99特征,如;动态数组,即时变量。
黑暗小车 2019-02-09
  • 打赏
  • 举报
回复
题目 问题描述   给定n个十六进制正整数,输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式   输出n行,每行为输入对应的八进制正整数。      输入的十六进制数不会有前导0,比如012A。   输出的八进制数也不能有前导0。 样例输入   2   39   123ABC 样例输出   71   4435274      先将十六进制数转换成某进制数,再由某进制数转换成八进制。
黑暗小车 2019-02-09
  • 打赏
  • 举报
回复
运行出错,什么原因,在codeblocks上输入输出没问题,但在蓝桥杯里边评测确是运行错误,大佬出来帮帮忙

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧