1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!
题目:
对于一个整数X(1 ≤ x、y ≤ 1000),定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.现在给出整数x和y,要求rev(rev(x) + rev(y))为多少? 输入描述:输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。 输出描述:输出rev(rev(x) + rev(y))的值 示例:输入:123 100 输出:223
算法描述:
方法一:寻找整数与各位之间的对应关系。如“123”,首先考虑怎么逆序取出各数,即怎么取出3、2、1,方法如下:
并且整数与其各位数之间还有这样的关系:321 = (3*10 + 2)*10 + 1。由此,可设计出如下的算法函数:
int rev(int n)
{
int m = 0;
while(n!=0)
{
m = 10*m + n%10;
n = n/10;
}
return m;
}
方法二:因为输入的参数的范围为:1 ≤ x、y ≤ 1000,所以可以首先依次求出各位数,然后再根据各位数重新组合成翻转后的数。算法函数如下:
int rev(int n)
{
int m;
int n_qian, n_bai, n_shi, n_ge;
int m_qian, m_bai, m_shi, m_ge;
n_qian = n/1000;
n_bai = n%1000/100;
n_shi = n%100/10;
n_ge = n%10;
if(0==n_qian) //n是三位数
{
m_bai = n_ge;
m_shi = n_shi;
m_ge = n_bai;
m = m_bai*100 + m_shi*10 + m_ge*1;
if(0==n_bai) //n是两位数
{
m_shi = n_ge;
m_ge = n_shi;
m = m_shi*10 + m_ge*1;
if(0==n_shi) //n是一位数
{
m_ge = n_ge;
m = m_ge;
}
}
}
else //n是四位数
{
m_qian = n_ge;
m_bai = n_shi;
m_shi = n_bai;
m_ge = n_qian;
m = m_qian*1000 + m_bai*100 + m_shi*10 + m_ge*1;
}
return m;
}
完整代码:
#include <stdio.h>
int rev(int n);
int main(void)
{
int x, y ,m,m1,m2;
scanf("%d %d", &x, &y);
printf("%d\n", rev(rev(x) + rev(y)));
return 0;
}
#if 1 //方法1
int rev(int n)
{
int m = 0;
while(n!=0)
{
m = 10*m + n%10;
n = n/10;
}
return m;
}
#else //方法2
int rev(int n)
{
int m;
int n_qian, n_bai, n_shi, n_ge;
int m_qian, m_bai, m_shi, m_ge;
n_qian = n/1000;
n_bai = n%1000/100;
n_shi = n%100/10;
n_ge = n%10;
if(0==n_qian) //n是三位数
{
m_bai = n_ge;
m_shi = n_shi;
m_ge = n_bai;
m = m_bai*100 + m_shi*10 + m_ge*1;
if(0==n_bai) //n是两位数
{
m_shi = n_ge;
m_ge = n_shi;
m = m_shi*10 + m_ge*1;
if(0==n_shi) //n是一位数
{
m_ge = n_ge;
m = m_ge;
}
}
}
else //n是四位数
{
m_qian = n_ge;
m_bai = n_shi;
m_shi = n_bai;
m_ge = n_qian;
m = m_qian*1000 + m_bai*100 + m_shi*10 + m_ge*1;
}
return m;
}
#endif
以上两种解法中,方法一具有通用性,方法二具有局限性,即必须知道所输入的数的范围才能做出专门的解决算法。
程序运行结果: