36进制的加法(C语言版)

146 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天

36进制的加法(C语言版)

前言

题目就咱就不叙述了,直接开整!!!
在这里插入图片描述

首先呢,我们先来想一下十进制的加法是怎样运算的,是不是这样的
从低位算着走,满10进1,把其余数留下来,举个特例

image.png 3+9大于10了吧那么他就应该向前进(3+9)/10,在%10得到2以此来作为个位的值,同理对于十位则应是(2+1+1)%10,商为0,向前进0,(2+1+1)%10=4,则十位就应为4,依次类推,得到最终结果142;
以此思想我们来解决36进制的加法;

一、10-35怎么表示?

我们知道a=10,b=11…可是我们应该如何表示出来呢? 根据:ASCLL码表的排版可知是不是有0+’0‘=’0‘,1+’0‘=’1‘… int n;(0=<n<=9)则有n+‘0’=‘n’; 同理char n;(‘a’=<n<=‘z’),则有n-’a‘+10=x 举个特例:char n=’c‘;根据公式是不是有x=12 是不是就代表着’c‘就代表着12,同理可以a,b…是不是都得以表示了 那我们直接根据这个公式写成两个函数就行了

int getInt(char n)//将'0'-'9'转换为0-9;'a'-'z'转换成10-35
{
	if (n >= '0' && n <= '9')
		return n - '0';
	else
	{
		return n - 'a' + 10;
	}
}
char getChar(int n)//将0-9转换为'0'-'9';a-z转换成’a'-‘z'
{
	if (n >= 0 && n <= 9)
		return n + '0';
	else
		return n - 10 + 'a';
}

二、操作代码

定义一个全局数组res来记录最终的结果 首先我们要计算出两个字符数组的长度(判断哪个字符数组先走完) 然后我们从c1和c2的低位开始相加 再相加之前呢,我们都首先把c1[i]和c2[j]转换为10进制数 直接调用getInt()函数就行了 最终计算出低位的值,再调用getChar(),将低位的值转变为用字符表示就行了,并把其放在res[k]里面 后面以次进行 如果是c1想结束,则以下就是c2单独循环以上步骤 如果是c2想结束,则以下就是c1单独循环以上步骤 最后res数组里面保存的是我们想要的结果的逆置 所以我们最后再将其局部逆置一下就行了

char*Add36(char *c1,char *c2)
{
	int len1 = (int)strlen(c1);
	int len2 = (int)strlen(c2);
	int i = len1 - 1;
	int j = len2 - 1;
	int tail = 0;
	int k = 0;
	while (j >-1&& i>-1)
	{
		int x = getInt(c1[i]);
		int y = getInt(c2[j]);
		int tmp = (x+y + tail) % 36;//余数作为低位结果
		tail = (x+y + tail) / 36;//商的话作为进几个1
		res[k] = getChar(tmp);
		j--;
		--i;
		k++;
	}
	if (i==-1&&j!=-1)//c1里面的元素走完了,c2里面还有剩余
	{
		while (j>-1)
		{
			int y = getInt(c2[j]);
			int tmp = ( y+tail) % 36;//余数
			tail = ( y+ tail) / 36;//除数
			res[k] = getChar(tmp);
			j--;
			k++;
		}
	}
	if(j==-1&&i!=-1)//c1里面的元素走完了,c2里面还有剩余
	{
		while (i>-1)
		{
			int x = getInt(c1[i]);
			int tmp = (x + tail) % 36;//余数
			tail = (x+ tail) / 36;//除数
			res[k] = getChar(tmp);
			i--;
			k++;
		}
	}
	int len = (int)strlen(res);
	My_reverse(res, len);//最后的话将局部元素转置一下;
	return res;
}

三、测试结果

image.png

image.png

总结

主要是实现getInt()函数和getChar()函数,字符和数字之间的互相转换
博主第一次写博客,写的菜的地方,还望大家海涵,
欢迎大家在评论区留言和讨论

image.png