【蓝桥】第八届C语言C组第7题 Excel地址(进制变形题,stack()简单使用)转载

标题: Excel地址

Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,

当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?

本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。

例如,
输入:
26
则程序应该输出:
Z

再例如,
输入:
2054
则程序应该输出:
BZZ

我们约定,输入的整数范围[1,2147483647]

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。


笨笨有话说:
这有点像进制关系,又不完全是。好像末2位是以1当26,末3位是以1当26*26

歪歪有话说:
要是从字母序列转数字还好点,倒过来有点麻烦,不过计算机跑得快啊。

分析:
1.乍一看,像是10进制转26进制的题目,细心一琢磨,实际上这种表示方法比真实的26进制表示要多表示些内容。
2.通常的一个进制数都是有0的,这里的表示方法中也可以把A当成零,但当Z进位是到AA时,而不是直接进位到BA,这样应该就能看出来确实比一般理解的26进制多表示了一些数。
3.或者这么理解,拿16进制举例,F是15,我们假设G为16,且没有0了,那么此时十进制16的十六进制就是一个G,十进制17的十六进制是11。(要是一时理解不了,多写几个连续数转换一下,可能就捋清楚关系了)

解法1:
先来一个常见的十进制转十六进制代码对比示例:
主要分析下代码1的 n/=16; 和代码2 a=(a-yushu)/26; 的不同。

代码1:

#include <iostream>
#include <stack> 
using namespace std;
int main()
{
	int n;
	char a[6]={'A','B','C','D','E','F'};
	cin>>n;
	stack<char> b;
	if(!n) cout<<n;
	while(n)
	{
		int c=n%16;
		if(c>=10)
		{
		b.push(a[c-10]);
		}
		else
		b.push(c+'0');
		n/=16;//由于标准16进制没有一个符号单独表示16,
		//这里直接除16就好了,这是和下面代码2的关键不同之处。
	 }
	 while(!b.empty())
	 {
	 	cout<<b.top();
	 	b.pop();
	 }
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

代码2:(内容来源于此链接(https://www.cnblogs.com/jweie/p/8371168.html) )

#include <iostream>
using namespace std;
int main()
{
    long long a;
    int yushu;
    int b[100];
    cin>>a;
    int i=0;
    while(a)
    {
        yushu=a%26;
        if(yushu==0)yushu=26;
        a=(a-yushu)/26;//这里主要是对于a是26的倍数进行处理,这里也是和一般进制转换不同的关键之处
        //常规的26进制数是没有符号表示26的,这里的Z实际就是26,当a取模的结果是0时,也就是26,且不用进位了,
        //故在这里做除法时减去了余数(当余数是26时才有作用,别的数就算不减去也会在整数除法计算中被当成小数舍去)
    b<span class="token punctuation">[</span>i<span class="token operator">++</span><span class="token punctuation">]</span><span class="token operator">=</span>yushu<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j<span class="token operator">=</span>i<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>j<span class="token operator">&gt;=</span><span class="token number">0</span><span class="token punctuation">;</span>j<span class="token operator">--</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%c"</span><span class="token punctuation">,</span>b<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">'A'</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

代码3:(对于代码1的stack()函数简单使用)

#include <iostream>
#include <stack>
using namespace std;
int main()
{
<span class="token keyword">int</span> a<span class="token punctuation">;</span> cin<span class="token operator">&gt;&gt;</span>a<span class="token punctuation">;</span>
stack<span class="token operator">&lt;</span><span class="token keyword">char</span><span class="token operator">&gt;</span>  st<span class="token punctuation">;</span> 
<span class="token keyword">while</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token keyword">int</span> x<span class="token operator">=</span>a<span class="token operator">%</span><span class="token number">26</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span><span class="token punctuation">(</span>x<span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">)</span> x<span class="token operator">=</span><span class="token number">26</span><span class="token punctuation">;</span>
	a<span class="token operator">=</span><span class="token punctuation">(</span>a<span class="token operator">-</span>x<span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">26</span><span class="token punctuation">;</span>
	st<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token operator">+</span>x<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">while</span><span class="token punctuation">(</span><span class="token operator">!</span>st<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	cout<span class="token operator">&lt;&lt;</span>st<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	st<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

解法2(学长代码,换一个思路看问题)

大体思路是,把每次进位的上限值放入数组val[i],从个位十位百位依次向高位处理,输入值n与各个位数上限val[i]做取模运算,并用数组ch[i]存储在每个位数上a取模的值,这里没有除法运算,直接减去上限val[i]即可。

(不明白可以提问我,当然可能你看到这篇文章时,我已经发表了很久了,久到我都忘了我发过什么了😂)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;

int main()
{
ll val[20];
char ch[20]={0};
int n,i,tmp;
val[0]=1;
for(i=1;i<=7;i++){
val[i]=26llval[i-1];
}
scanf("%lld",&n);
for(i=0;i<=6&&n>0;i++){
if(n%val[i+1]==0){
ch[i]='Z';
n-=26
val[i];
}
else{
ch[i]='A'+(n%val[i+1])/val[i]-1;
n-=n%val[i+1];
}
}
for(i=6;i>=0;i--){
if(ch[i]!=0) printf("%c",ch[i]);
}
printf("\n");
return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

反向看问题:

这题算是十进制转26进制的变形题,下面这个代码正好倒过来,供大家参考
代码来源:https://blog.csdn.net/hannea/article/details/25111051

//这是一道关于进制的题目,其本质是把十进制数字用A~Z表示成二十六进制。

#include<iostream>
#include<string>
using namespace std;
int StringToInt(const string& str)
{
int length = str.length();//这里也可用str.size().

<span class="token keyword">if</span><span class="token punctuation">(</span>length <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token comment">//如果没有输入字符,则报错。</span>
	<span class="token punctuation">{</span>
		cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Invalid input"</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
		<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>

<span class="token keyword">int</span> sum <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token comment">//如果输入的字符为空字符,输出为0.</span>

<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token keyword">int</span> temp <span class="token operator">=</span> str<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> <span class="token string">'A'</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span><span class="token punctuation">(</span>temp <span class="token operator">&gt;=</span> <span class="token number">26</span> <span class="token operator">||</span> temp <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
	<span class="token punctuation">{</span>
		cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Invalid input"</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
		<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	sum <span class="token operator">=</span> <span class="token number">26</span><span class="token operator">*</span>sum <span class="token operator">+</span> temp <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>
<span class="token keyword">return</span> sum<span class="token punctuation">;</span>

}
int main()
{
string str;
while( getline(cin,str) )//这里如果用cin >> str,不能输入空的字符串。
cout<<str << ":" << StringToInt(str)<<endl;
return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
                                </div>
posted @ 2019-07-29 17:10  浅滩浅  阅读(338)  评论(0)    收藏  举报