Tsinsen_A1014. 进制转换5

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示

  先将十六进制数转换成某进制数,再由某进制数转换成八进制。


#include<stdio.h>
//#include<iostream>
#include<string.h>
//using namespace std;
//注释部分  当时用来调试的 
const int maxn = 400000 + 5;
const int maxn2 = 100000 + 5;
char s[maxn2];
int  d[maxn], b[4], _count;
int flag;

void init() {
	memset(s, '\0', sizeof(s));
	memset(d, 0, sizeof(d));
	memset(b, 0, sizeof(b));
	_count = 0;
}

int c_d(int ch) {
	if(ch >= 'A' && ch <= 'F') return (ch -'A' +10);
	else return (ch - 48);
}

void chu(int x, int* b, int cs) {
	int bcs = x, sz, cnt = 4;
	//memset(b, 0, sizeof(b));   //为什么这样的初始化不行 
	b[0] = b[1] = b[2] = b[3] = 0;  //这样初始化就成功了 
	while(sz = (bcs/cs)) {
		b[--cnt] = bcs%cs;
		bcs = sz; 
		//cout << "___" << cnt << "____" << endl;
	}
	b[--cnt] = bcs%cs;        //    问题就是出在这儿了   如果算出来的位数不满足4位的话应该要处理一番 
	//int bz = 3-cnt; // bz   表示不足的位数   刚好就是cnt的数值 
	//cout << " 不足的位数  " << bz << endl; 
/*	for(int i = bz-1, j = 3; i >=0 && j >= bz && cnt != 0; i--, j--) {  //移位次数 
		b[j-bz] = b[cnt];
		cnt--;
	}
	//移位结束之后就用0填充所有剩下的空位
	for(int i = 3; i >= 4-bz; i--) b[i] = 0;
*/   //本就无需移位操作,,,,是自己思路不清晰 
}

int bq(int x) {
	return 3-x%3;
}

int main() {
	int N, sum;
	while(scanf("%d", &N) != EOF) {
		for(int i = 0; i < N; i++) {
			init();
			scanf("%s",s);
			for(int j = strlen(s)-1; j >= 0; j--) {
			//	memset(d, 0, sizeof(d));
				flag = 0;
				chu(c_d(s[j]), b, 2);
				//cout << s[j] << "-----" << c_d(s[j]) << "  b[0] -- > b[3]  " << b[0] << " "  << b[1] << " " << b[2] << " " << b[3] << endl;
				for(int k = 3; k >= 0; k--)   // 注意i j  k  这些for循环中的变量 
				{
				//cout << d[_count] << "  ****  ";	
					d[_count++] = b[k];     
				//cout << "    " << "  b[i]  " << b[i] << "  _count " << _count << " " << d[_count-1] << "  ..上面..  " << endl; 
				}
			}
			_count = _count + bq(_count);  //统计好所需要的数组元素个数
			//cout << _count << "   ----___----   " << endl;
			//for(int i = 0; i < _count; i++) cout << " " << d[i] << " ";
		//	cout << endl;
			int _cs = _count/3;
			for(int j = 0; j < _cs; j++) {
				sum = d[_count-1]*4 + d[_count-2]*2 + d[_count-3];
				_count -= 3;
				   // printf("%d", sum);    //注意还不能有前导0  否则这里应该用while写一个判断   待定! 
				if(!flag && !sum) continue;
				else {flag = 1; printf("%d", sum);
				}
			}
			printf("\n");
		}
	}
	return 0;
} 

//大爷的 ,这题搞得哥哥我差点儿吐血

说到底  还是我太水了。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值