基本 (1) 16 進数から 8 進数

16 進数から 8 進数までのテスト問題の基本演習

リソースの制約

メモリ制限: 512.0MB C/C++ 時間制限: 1.0 秒 Java 時間制限: 3.0 秒 Python 時間制限: 5.0 秒

問題の説明
  n 個の正の 16 進数整数が与えられた場合、それらに対応する 8 進数を出力します。

入力形式
  入力の最初の行は、正の整数 n (1<=n<=10) です。
  次の n 行、各行は 0 ~ 9 と大文字の A ~ F からなる文字列で、変換する 16 進数の正の整数を示し、各 16 進数の長さは 100000 を超えません。

出力形式
  n 行を出力します。各行は 8 進数の正の整数入力に対応します。

  [注意]
  入力する 16 進数は、012A のように先頭に 0 が付きません。
  また、出力の 8 進数には先行ゼロがあってはなりません。

サンプル入力
  2
  39
  123ABC

サンプル出力
  71
  4435274

  [プロンプト]
  最初に 16 進数を特定の基数に変換し、次に特定の基数を 8 進数に変換します。

特定のアイデアは変換関数を与え、最初に16進数を整数に変換し、次に整数を8進数の文字列に変換します

変更機能を見てください

バージョン 1: 数値を中間プロセスとして使用するため、データが長すぎてまったく受信できません。

#include<iostream>
#include<vector>
#include<string>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;

string change(string& s)
{
	string res;
	long long num = 0;
	int step = 0;
	for (int i = s.size() - 1; i >= 0; i--)
	{
		switch (s[i])
		{
		case '1':
			num += 1 * pow(16, step++);
			break;
		case '2':
			num += 2 * pow(16, step++);
			break;
		case '3':
			num += 3 * pow(16, step++);
			break;
		case '4':
			num += 4 * pow(16, step++);
			break;
		case '5':
			num += 5 * pow(16, step++);
			break;
		case '6':
			num += 6 * pow(16, step++);
			break;
		case '7':
			num += 7 * pow(16, step++);
			break;
		case '8':
			num += 8 * pow(16, step++);
			break;
		case '9':
			num += 9 * pow(16, step++);
			break;
		case 'A':
			num += 10 * pow(16, step++);
			break;
		case 'B':
			num += 11 * pow(16, step++);
			break;
		case 'C':
			num += 12 * pow(16, step++);
			break;
		case 'D':
			num += 13 * pow(16, step++);
			break;
		case 'E':
			num += 14 * pow(16, step++);
			break;
		case 'F':
			num += 15 * pow(16, step++);
			break;
		}
	}
	int m;
	while (num)
	{
		m = num % 8;
		num /= 8;
		res += '0'+m;
        // res += to_string(m);
	}
	reverse(res.begin(), res.end());
	return res;
}

int main()
{
	int n;
	cin >> n;
	vector<string> v(n);
	vector<string> res(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
		string temp = change(v[i]);
		res[i] = temp;
	}
	for (int i = 0; i < n; i++)
	{
		cout << res[i];
		cout << endl;
	}
	return 0;
}

【解決策2】16-"2-"8ベースを使う

#include <iostream>
using namespace std;

int main()
{
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
	{	
		string tow;
		string sixteen;
		string eight;
		cin>>sixteen;
		for(int j=0; j<sixteen.length(); j++)
		{
			switch(sixteen[j])
			{
				case '0':tow+="0000";break;
				case '1':tow+="0001";break;
				case '2':tow+="0010";break;
				case '3':tow+="0011";break;
				case '4':tow+="0100";break;
				case '5':tow+="0101";break;
				case '6':tow+="0110";break;
				case '7':tow+="0111";break;
				case '8':tow+="1000";break;
				case '9':tow+="1001";break;
				case 'A':
				case 'a':tow+="1010";break;
				case 'B':
				case 'b':tow+="1011";break;
				case 'C':
				case 'c':tow+="1100";break;
				case 'D':
				case 'd':tow+="1101";break;
				case 'E':
				case 'e':tow+="1110";break;
				case 'F':
				case 'f':tow+="1111";break;
			}
		}
		if(tow.length()%3==1)
			tow="00"+tow;
		if(tow.length()%3==2)
			tow="0"+tow;
		if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0'))
		{
			char temp;
			temp = (tow[0]-'0')*4+(tow[1]-'0')*2+tow[2];
			eight += temp;
		}
		for(int j=3; j<tow.length(); j+=3)
		{
			eight+=(tow[j]-'0')*4+(tow[j+1]-'0')*2+tow[j+2];
		}
		cout<<eight<<endl;
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_66151870/article/details/129328223