开启左侧

颠倒的价牌

二维码 [复制链接]
171 0
小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。

    其标价都是4位数字(即千元不等)。

    小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参见p1.jpg)。

    这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!

    当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。

    有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!

    庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。

    请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?


这个题目思路应该是这样的:
把能够倒读的数字作为一个数组保存起来,求Cn4的排列组合,一个数倒读与顺读相差范围在200与300之间,另一个数倒读与顺读相差在800与900之间
上面是我的思路,仅供参考,大家可以想更便捷的思路出来供我们欣赏


能倒读的数字:0 1 2 5 6 8 9  



  1. // 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。
  2. // 其标价都是4位数字(即千元不等)。小李为了标价清晰、方便,使用了预制的类似数
  3. // 码管的标价签,只要用颜色笔涂数字就可以了这种价牌有个特点,对一些数字,倒过
  4. // 来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有
  5. // 可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!
  6. // 当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
  7. // 有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这
  8. // 两个价格牌的电视机都卖出去了!庆幸的是价格出入不大,其中一个价牌赔了2百多,
  9. // 另一个价牌却赚了8百多,综合起来,反而多赚了558元。
  10. // 请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?

  11. #include <stdio.h>
  12. #include <string.h>

  13. // 数组最大容量
  14. #define STACK_SIZE 128

  15. // 价钱结构
  16. typedef struct  
  17. {
  18.     int min;    // 正反价格的较小者
  19.     int max;    // 正反价格的较大者
  20.     int diff;   // 正反价格的差值(根据需要取正数或负数)
  21. }Price;

  22. // 保存价钱信息的数组结构
  23. typedef struct  
  24. {
  25.     Price stack[STACK_SIZE];  // 保存满足条件的价钱信息
  26.     size_t size;              // stack中存的价钱信息的条数
  27. }PriceStack;

  28. // -------------------------------------------------------------------------
  29. // - 函 数 名: insertPriceStack
  30. // - 功能描述: 二分插入价钱信息到数组中
  31. // - 输入参数: price - 价钱信息
  32. // - 输出参数: priceStack
  33. // - 返 回 值: 无
  34. // - 备    注: 无
  35. // -------------------------------------------------------------------------
  36. void insertPriceStack(PriceStack *priceStack, const Price *price)
  37. {
  38.     int high; // 二分查找高分位
  39.     int low;  // 二分查找低分位
  40.     int mid;  // 高低分位的中值
  41.     int i;

  42.     // 参数检查
  43.     if (NULL == priceStack || NULL == price)
  44.     {
  45.         return;
  46.     }

  47.     low = 0;
  48.     high = priceStack->size - 1;

  49.     // 查找插入位置
  50.     while (low <= high)
  51.     {
  52.         mid = (low + high) / 2;
  53.         
  54.         if (price->min > priceStack->stack[mid].min)
  55.         {
  56.             low = mid + 1;
  57.         }
  58.         else if (price->min < priceStack->stack[mid].min)
  59.         {
  60.             high = mid - 1;
  61.         }
  62.         else
  63.         {
  64.             return; // 重复记录,丢弃
  65.         }
  66.     }
  67.    
  68.     // 将插入位置后的元素全部右移一个位置
  69.     for (i = priceStack->size; i > low; i--)
  70.     {
  71.         priceStack->stack[i] = priceStack->stack[i - 1];
  72.     }

  73.     // 插入元素
  74.     priceStack->stack[low] = *price;
  75.     priceStack->size++;
  76. }

  77. // -------------------------------------------------------------------------
  78. // - 函 数 名: printPriceStack
  79. // - 功能描述: 打印价钱信息数组中的记录
  80. // - 输入参数: priceStack - 价钱信息数组
  81. // - 输出参数: 无
  82. // - 返 回 值: 无
  83. // - 备    注: 无
  84. // -------------------------------------------------------------------------
  85. void printPriceStack(const PriceStack *priceStack)
  86. {
  87.     size_t i;

  88.     if (NULL == priceStack)
  89.     {
  90.         return;
  91.     }

  92.     for (i = 0; i < priceStack->size; i++)
  93.     {
  94.         printf("[%2u] min: %d max: %d diff: %d\n", i,
  95.             priceStack->stack[i].min,
  96.             priceStack->stack[i].max,
  97.             priceStack->stack[i].diff);
  98.     }
  99. }

  100. int main()
  101. {
  102.     const int num1[] = {1, 2, 5, 6, 8, 9, 0};
  103.     const int num2[] = {1, 2, 5, 9, 8, 6, 0};
  104.     PriceStack stack1; // 用于保存相差200多的价钱,价钱差取负数
  105.     PriceStack stack2; // 用于保存相差800多的价钱,价钱差取正数
  106.     Price price;
  107.     int a, b, c, d;
  108.     size_t i, j;

  109.     memset(&stack1, 0, sizeof(stack1));
  110.     memset(&stack2, 0, sizeof(stack2));

  111.     // 遍历搜索满足条件的价钱
  112.     for (a = 0; a < 6; a++) // 首位不能为0
  113.     {
  114.         for (b = 0; b < 7; b++)
  115.         {
  116.             for (c = 0; c < 7; c++)
  117.             {
  118.                 for (d = 0; d < 6; d++) // 末位不能为0
  119.                 {
  120.                     // 正着读的价钱
  121.                     price.min = num1[d] + num1[c] * 10 + num1[b] * 100 + num1[a] * 1000;
  122.                     // 倒着读的价钱
  123.                     price.max = num2[a] + num2[b] * 10 + num2[c] * 100 + num2[d] * 1000;

  124.                     if (price.min > price.max)
  125.                     {
  126.                         int temp;

  127.                         temp = price.min;
  128.                         price.min = price.max;
  129.                         price.max = temp;
  130.                     }

  131.                     price.diff = price.max - price.min;
  132.                     if (200 <= price.diff && 300 > price.diff)
  133.                     {
  134.                         price.diff = -price.diff; // 价钱差200多的差值取负数
  135.                         insertPriceStack(&stack1, &price);
  136.                     }
  137.                     else if (800 <= price.diff && 900 > price.diff)
  138.                     {
  139.                         insertPriceStack(&stack2, &price);
  140.                     }
  141.                 }
  142.             }
  143.         }
  144.     }

  145.     // 打印筛选结果,用于调试
  146.     printPriceStack(&stack1);
  147.     printPriceStack(&stack2);

  148.     // 遍历查找价钱总差为558的两项
  149.     for (i = 0; i < stack1.size; i++)
  150.     {
  151.         for (j = 0; j < stack2.size; j++)
  152.         {
  153.             if (558 == stack1.stack[i].diff + stack2.stack[j].diff)
  154.             {
  155.                 printf("[%2u] min: %d max: %d diff: %d "
  156.                     "& [%2u] min: %d max: %d diff: %d\n", i,
  157.                     stack1.stack[i].min,
  158.                     stack1.stack[i].max,
  159.                     stack1.stack[i].diff,
  160.                     j, stack2.stack[j].min,
  161.                     stack2.stack[j].max,
  162.                     stack2.stack[j].diff);
  163.             }
  164.         }
  165.     }

  166.     return 0;
  167. }
复制代码



赞助本站





上一篇:排它平方数
下一篇:第一个最长子串
学会善用【论坛搜索】功能,很多你要寻找的答案就在这里面;
如果大家发现帖子中链接有错误,请到【爱好街链接地址失效有奖报错】回帖,我们会在第一时间送上反馈的奖励!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

发新帖 回复

104

主题

104

帖子

233

街币
更多

精彩推荐

新人报到专用贴
新人报到专用贴
==新人报道格式(选填)== 【我的昵称】: 【我的性别
爱好街资源共享区文件解压密码
爱好街资源共享区文件解压密码
因本站分享的文件实在太多,目前收集整理已经接近4T,所以有些文
独立团VIP教程第1-7版全套打包下载(含课件源码工具等)
独立团VIP教程第1-7版全套打包
独立团第1版易语言教程 独立团第一版1易语言入门 1-1-1外
爱好街链接地址失效有奖报错
爱好街链接地址失效有奖报错
我们的成长离不开大家的支持!! 各位爱好街的会员:
魔鬼作坊vip教程辅助制作培训之零基础绝密汇编语言入门课程
魔鬼作坊vip教程辅助制作培训
这套课程为汇编入门教程,学习游戏逆向反汇编需要用到的基础知
万挂作坊教程+封包+E模块(全套下载)
万挂作坊教程+封包+E模块(全套
万挂-封包 封包加密解密-01 封包加密解密-02 封包加密

免责声明:
在爱好街发布的文章与主题属会员个人意见,与本站立场无关,文章内容由作者与爱好街享有相关版权,如需转载请注明出处或取得会员与本站的许可,否则本站将追究相应的法律责任,如部分内容有侵犯任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意。另外不得将本站内容用于商业或者非法用途,否则,一切后果请用户自负。

Mail To:MasTer@AiHaiJie.Com

快速回复
快速回复 返回顶部 返回列表