[recruitment programming 03] integer flip

 

Title:

For an integer X(1 ≤ x, y ≤ 1000), the definition operation rev(X) is to flip X by digit and remove leading 0. For example:
If X = 123, rev(X) = 321;
If X = 100, then rev(X) = 1. Now give the integers x and y, what is the required rev(rev(x) + rev(y))? Input Description: input as a line, x, y(1 ≤ x, y ≤ 1000), separated by spaces. Output Description: output the value of rev(rev(x) + rev(y)). Example: input: 123 100 output: 223

 

Algorithm description:

Method 1: find the corresponding relationship between integers and bits. For example, "123", first consider how to take out the numbers in reverse order, that is, how to take out 3, 2 and 1. The method is as follows:

 

                               

 

 

And there is a relationship between integers and their bits: 321 = (3 * 10 + 2) * 10 + 1. Therefore, the following algorithm functions can be designed:

int rev(int n)
{
	int m = 0;
	while(n!=0)
	{
		m = 10*m + n%10;
		n = n/10;
	}
	return m;
}

Method 2: because the range of input parameters is: 1 ≤ x, y ≤ 1000, the number of each digit can be calculated in turn, and then recombined into the number after flipping according to each digit. The algorithm functions are as follows:

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 is three digits
	{
		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 is two digits
		{
			m_shi = n_ge;
			m_ge = n_shi;
			m = m_shi*10 + m_ge*1;
			if(0==n_shi) //n is a single digit
			{
				m_ge = n_ge;
				m = m_ge;
			}
		}
	}
	else  //n is four digits
	{
		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;
}

 

Full code:

#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 / / method 1
int rev(int n)
{
	int m = 0;
	while(n!=0)
	{
		m = 10*m + n%10;
		n = n/10;
	}
	return m;
}
#else / / method 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 is three digits
	{
		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 is two digits
		{
			m_shi = n_ge;
			m_ge = n_shi;
			m = m_shi*10 + m_ge*1;
			if(0==n_shi) //n is a single digit
			{
				m_ge = n_ge;
				m = m_ge;
			}
		}
	}
	else  //n is four digits
	{
		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

Among the above two solutions, method one has generality and method two has limitation, that is, it is necessary to know the range of the input number to make a special solution algorithm.

 

Program running results:

 

Welcome to scan the QR code on the left and follow my wechat public account (also searchable: zhengnian-2018)

Added by UTAlan on Sat, 21 Dec 2019 23:33:06 +0200