查看原文
其他

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。由此,可设计出如下的算法函数:

  1. int rev(int n)

  2. {

  3. int m = 0;

  4. while(n!=0)

  5. {

  6. m = 10*m + n%10;

  7. n = n/10;

  8. }

  9. return m;

  10. }

方法二

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

  1. int rev(int n)

  2. {

  3. int m;

  4. int n_qian, n_bai, n_shi, n_ge;

  5. int m_qian, m_bai, m_shi, m_ge;

  6. n_qian = n/1000;

  7. n_bai = n%1000/100;

  8. n_shi = n%100/10;

  9. n_ge = n%10;

  10. if(0==n_qian) //n是三位数

  11. {

  12. m_bai = n_ge;

  13. m_shi = n_shi;

  14. m_ge = n_bai;

  15. m = m_bai*100 + m_shi*10 + m_ge*1;

  16. if(0==n_bai) //n是两位数

  17. {

  18. m_shi = n_ge;

  19. m_ge = n_shi;

  20. m = m_shi*10 + m_ge*1;

  21. if(0==n_shi) //n是一位数

  22. {

  23. m_ge = n_ge;

  24. m = m_ge;

  25. }

  26. }

  27. }

  28. else //n是四位数

  29. {

  30. m_qian = n_ge;

  31. m_bai = n_shi;

  32. m_shi = n_bai;

  33. m_ge = n_qian;

  34. m = m_qian*1000 + m_bai*100 + m_shi*10 + m_ge*1;

  35. }


  36. return m;

  37. }

完整代码

  1. /*******************************************************************************************************

  2. ** 题 目: 对于一个整数X(1 ≤ x、y ≤ 1000),定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:

  3. 如果 X = 123,则rev(X) = 321;

  4. 如果 X = 100,则rev(X) = 1.现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?


  5. ** 输 入: 输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。

  6. ** 输 出: 输出rev(rev(x) + rev(y))的值

  7. ** 样例输入:123 100

  8. ** 样例输出:223

  9. ********************************************************************************************************/

  10. #include <stdio.h>


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


  12. int rev(int n);


  13. int main(void)

  14. {

  15. int x, y ,m,m1,m2;

  16. scanf("%d %d", &x, &y);

  17. printf("%d\n", rev(rev(x) + rev(y)));


  18. return 0;

  19. }


  20. #if Method // 方法1:通用法

  21. int rev(int n)

  22. {

  23. int m = 0;

  24. while(n!=0)

  25. {

  26. m = 10*m + n%10;

  27. n = n/10;

  28. }

  29. return m;

  30. }

  31. #else // 方法2:特殊法

  32. int rev(int n)

  33. {

  34. int m;

  35. int n_qian, n_bai, n_shi, n_ge;

  36. int m_qian, m_bai, m_shi, m_ge;

  37. n_qian = n/1000;

  38. n_bai = n%1000/100;

  39. n_shi = n%100/10;

  40. n_ge = n%10;

  41. if(0==n_qian) //n是三位数

  42. {

  43. m_bai = n_ge;

  44. m_shi = n_shi;

  45. m_ge = n_bai;

  46. m = m_bai*100 + m_shi*10 + m_ge*1;

  47. if(0==n_bai) //n是两位数

  48. {

  49. m_shi = n_ge;

  50. m_ge = n_shi;

  51. m = m_shi*10 + m_ge*1;

  52. if(0==n_shi) //n是一位数

  53. {

  54. m_ge = n_ge;

  55. m = m_ge;

  56. }

  57. }

  58. }

  59. else //n是四位数

  60. {

  61. m_qian = n_ge;

  62. m_bai = n_shi;

  63. m_shi = n_bai;

  64. m_ge = n_qian;

  65. m = m_qian*1000 + m_bai*100 + m_shi*10 + m_ge*1;

  66. }


  67. return m;

  68. }

  69. #endif

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

运行结果

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


博客网站

zhengnianli.github.io


猜你喜欢

C语言每日一练(007)

C语言每日一练(008)

C语言每日一练(009)

C语言每日一练(010)

C语言每日一练(011)


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


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存