十六进制转八进制+超大数据处理(蓝桥杯基础练习C/C++)

目录

 1  题目要求

2  代码

2.1  以十进制为媒介(不可行) 

2.2  以二进制为媒介

3  可能会遇到的难点

4  结论

5  延伸

5.1  超大数据阶乘

5.2  超大数据加法

5.3  以十进制为媒介的进制转换


1  题目要求

十六进制转八进制+超大数据处理(蓝桥杯基础练习C/C++)_第1张图片

2  代码

2.1  以十进制为媒介(不可行) 

我首先想到的就是十六进制转十进制,十进制转八进制,毕竟这样的方法是最常见的,但始终出现报错。

我想可能是int能储存的数范围太小了,就尝试用long long存储,结果还是报错。

#include 
using namespace std;
string a;
int n;
long long sum; 
int b[10][9999999];
long long cnt[10];
int i;
int shiliu()
{
	sum=0;
	for(int j=0;j=65)
		{
			sum=sum+((int)a[j]-65+10)*pow(16,a.size()-j-1);
		}
		else
		{
			sum=sum+((int)a[j]-48)*pow(16,a.size()-j-1);
		}
	}
	return sum;
}

int ba(int temp)
{
	int k=0;
	while(temp>0)
	{
		b[i][k]=temp%8;
		temp/=8;
		cnt[i]++;
		k++;
	}
	return 0;
}

int main()
{
	cin>>n;
	for(i=0;i>a;
		ba(shiliu());
	}
	for(i=0;i

看到测试的数据,出错的原因就显而易见了。

显然十进制肯定存不进去,只能换个思路

2.2  以二进制为媒介

那么不妨用十六进制转二进制,二进制转八进制,毕竟二进制、四进制、八进制、十六进制这几种进制数之间有比较特殊的关系:可以统统转化成二进制,然后把数位捏成一位。(这里不具体讲解了)这里参考博主码农阿波的文章并加以改进,代码如下:

#include 
using namespace std;

int main() 
{
 int n;      //十六进制数数量
 int i,j,k; // 计数变量 
 int result;
 int str_len;
 cin>>n;
 char str[n][100000];
 //建立数组,保存16个十六进制数对应的二进制数
 char demo[16][5] = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};//因为字符串自动以\0结尾,所以设定数组大小的时候要改为5 
 for(i=0;i>str[i];
  k=0;//每次计算都要把k重置,非常重要,不可删去!! 
  str_len = strlen(str[i]);   //计数十六进制数长度 
  int ss = 4*str_len%3;         //判断转换后的二进制数数量是否为3的倍数,(十六进制转二进制是1位转4位,二进制转八进制是3位转1位,二进制数3个一组,求组不成整组的数字个数) 
  char temp[4*str_len+3-ss];//存放二进制数              *难点2* 
  if(ss == 1)       //*难点4* 
  {
   strcat(temp,"00");
   k=k+2;
  }
  if(ss == 2){
   strcat(temp,"0");
   k++;
  }
  /* 进行十六进制向二进制数的转换  */
        for(j=0;j

图解:

十六进制转八进制+超大数据处理(蓝桥杯基础练习C/C++)_第2张图片

3  可能会遇到的难点

难点1:利用ASCII码进行进制转换

解答1:具体的例题可以看我之前的文章

难点2:求余数的目的

解答2:在代码中的注释部分有讲解

难点3:j==0单独讨论的原因

解答3:在代码中的注释部分有讲解

难点4:为什么会出现用0部位的现象

解答4:正常来说从二进制转化成八进制需要从个位起每三位转化成一位,需要倒序而且对于剩余的凑不成三个数的情况难以处理。所以需要在最前面填写适当位数(适当位数=3-ss,这就是求余数的目的)的0使二进制形式位数凑成3的倍数,这样做之后可以发现我们从前往后转八进制和从后往前转八进制是一个效果。那么,就可以不用倒序便能求解

4  结论

显然,利用二进制转化不方便,但是应对如此庞大的数据,我们也只能这样解决

但是现在唯一不满足的一点是,这个程序输入一个数就马上输出一个数,没有存储和同时输出的效果,暂时还没有啥好的办法,如果有什么好的想法可以在评论区下留言。

5  延伸

5.1  超大数据阶乘

#include 
using namespace std;
int a[10005];   
int main()
{
    long long n,temp;
    cin>>n;
    a[0]=1;
    int s,c=0;  //c 进位 
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<10000;j++)//手算原理 
		{
            s=a[j]*i+c; 
            a[j]=s%10;
            c=s/10;
        }   
    }
    for(int i=10000;i>=0;i--)
	{
        if(a[i]!=0)//保证首位不为0 
		{
            for(int j=i;j>=0;j--)//倒序输出 
			{
                cout<

5.2  超大数据加法

#include 
using namespace std;

int arr[101],atemp[101];
int brr[101],btemp[101];
int crr[101];
string a,b;
int main()
{
	cin>>a>>b;
	for(int i=0;i=b.size())
	{
		for(int i=0;i=0;i--)
		{
			if(atemp[i]+btemp[i]+crr[i]>=10)
			{
				crr[i-1]++;//进位 
				crr[i]+=atemp[i]+btemp[i]-10;
			}
			else
			{
				crr[i]+=atemp[i]+btemp[i];
			}
		}
		for(int i=0;i<=a.size();i++)
		{
			if(crr[i]!=0)
			{
				for(int j=i;j<=a.size();j++)
				{
					cout<=1;i--)
		{
			if(atemp[i]+btemp[i]+crr[i]>=10)
			{
				crr[i-1]++;
				crr[i]+=atemp[i]+btemp[i]-10;
			}
			else
			{
				crr[i]+=atemp[i]+btemp[i];
			}
		}
		for(int i=0;i<=b.size();i++)
		{
			if(crr[i]!=0)
			{
				for(int j=i;j<=b.size();j++)
				{
					cout<

十六进制转八进制+超大数据处理(蓝桥杯基础练习C/C++)_第3张图片

5.3  以十进制为媒介的进制转换

详见下面文章:

(1条消息) 任意进制转换成十进制/十进制转换成任意进制(ASCII码法)(C/C++)_菜只因C的博客-CSDN博客

你可能感兴趣的:(蓝桥杯,算法,十六进制转八进制,c,超大数据处理)