通过公式求出A-Z的acsall码转化成1-26

前言:

近日在做题的时候,突然看见题目中有一个大写A-Z转换成1-26个数字的小坑点,觉得简便的方法太过于乏味,于是想了一种新的方法来解决,可能比较的无易,但是感觉当时的思路较为重要,故而写篇博客记录一下。

大体思想:

当时是在想怎么将A的ascall码转化成1,联想到65%8==1,因此想到可以用到取余的操作,所以代码里的Get_ans%8就完成啦,但是这步仅限于将ascall码转化成数字范围是1-9的字母适用,因为"Get_ans%8"这步是求出了数字1-26中的个位数字,那么十位数字怎么求呢?我感觉这是一个亮点,待我详细讲来。

求出十位数字的具体思路:

65=8*8,那么65/8向下取整就是8,这里再带入A的ascall码65来举例。65转化成的1可以看成01,虽然数学理论上是全然行不通的,但是这是编程,(去你大爷的数学)。那么我01这个数十位上的0就可以用"8=65/8-8"*8这个式子。关于为啥65/8,前面已经详细讲过,这里着重解释下-8和*8两步操作。-8是因为我A已经是26个字母中最小的一个,而转化成的ascall码的65/8的商8也已经是26个字母转化成的ascall码中最小的一个,因为十位上是01,所以我这个8是必然要减去的。"*8"这步操作呢,是为了ascall码转换为数字时是10-26的uu们准备的,他们不像1-9,十位上没有任何数字,10-26的十位上分别有1,2两种可能性,所以我要*8来补上十位数字,关于这里为什么要乘以8呢,是因为我之前就是用8来做所有的取余操作,故而只能也必须用8来进行运算。

讲到这,公式理解已经大致讲完,随机贴上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
	int Get_ans;
	cin>>Get_ans;
	cout<<(Get_ans/8-8)*8+(Get_ans%8)<<endl;
	return 0;
}

大家可以拿去测试一下,A-Z的ascall码是65-90,此代码能完美计算出结果,无纰漏,但是此代码仅可求A-Z转换成1-26的问题,虽不比有的方法简单,但是思路较难,理解为重。

创作不易,请勿白嫖!麻烦给个三连+关注!谢 

猜你喜欢

转载自blog.csdn.net/2301_76331300/article/details/131775874