单片机技术网|技术阅读
登录|注册

您现在的位置是:单片机技术网 > 技术阅读 > C语言每日一练(014)

C语言每日一练(014)

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间阅读编程笔记!

题目

对于一个整数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;

  • }

  • 方法二

    因为输入的参数的范围为: 1xy1000,所以可以首先依次求出各位数,然后再根据各位数重新组合成翻转后的数。算法函数如下:

  • 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;

  • }

  • 完整代码

  • /*******************************************************************************************************

  • ** 题 目: 对于一个整数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

  • ********************************************************************************************************/

  • #include <stdio.h>


  • #define Method 1 // 1:通用法 0:特殊法


  • 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 Method // 方法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

  • 以上两种解法中,方法一具有通用性,方法二具有局限性,即必须知道所输入的数的范围才能做出专门的解决算法。

    运行结果

    转发、点在看就是对小编最大的支持!


    博客网站

    zhengnianli.github.io


    猜你喜欢





    聊天界面输入m获取往期笔记目录