免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4546 | 回复: 12
打印 上一主题 下一主题

[C++] 编程求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-25 14:54 |只看该作者 |倒序浏览
写程序在1,2,…,9(保持这个顺序)之间可任意放+或-或都使其结果等于100,输出所有可能的放法。例如:1 + 2 + 3 – 4 + 5 + 6 + 78 + 9 = 100。

论坛徽章:
0
2 [报告]
发表于 2013-12-25 14:57 |只看该作者
期待大神出现

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
3 [报告]
发表于 2013-12-25 15:06 |只看该作者
思路很明确,就是懒得动手。每个数字之间三种情况加号、减号或者什么都没有,一共有8个位置,于是一共有3的8次方=6561种情况。
遍历6561种情况对于计算机来说还不是小菜一碟!?

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2013-12-25 16:46 |只看该作者
本帖最后由 Herowinter 于 2013-12-25 16:58 编辑

本人文盲,以下代码来自google搜索,
本人完全不理解其中的任何含义,
本人对此可能引发的任何不良后果不负任何责任。
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char op,str[80];
  5.     int i,j,s,n,m,ptr;
  6.     for (i=0;i<=6561;i++) /*i是每一种枚举的情况,把i分解为八位3进制数,每一位表示每一个位置的符号*/
  7.     {
  8.         s=0; /*该方式下的和*/
  9.         m=1; /*作操作数*/
  10.         n=i; /*获取i在3进制下的每一位会破坏i,所以借用变量n来获取*/
  11.         op='+'; /*第一次操作方式为+*/
  12.         ptr=0; /*指针用来记录运算过程*/
  13.         str[ptr++]='1'; /*首先记录一个1*/
  14.         for (j=2;j<=9;j++) /*八次循环,每次的下一个操作数是j*/
  15.         {
  16.             if (n%3) /*3进制下的第j-1位数,如果不是0,则要完成先前的操作*/
  17.             {
  18.                 if (op=='+') s+=m; else s-=m;m=j;
  19.             }
  20.             switch(n%3) /*根据这一位的情况进行处理*/
  21.             {
  22.                 case 0:m=m*10+j;break;
  23.                 case 1:op='+';break;
  24.                 case 2:op='-';break;
  25.             }
  26.             if (n%3) str[ptr++]=op; /*记录运算模式*/
  27.             str[ptr++]='0'+j;
  28.             n/=3;
  29.         }
  30.         
  31.         if (op=='+') s+=m;
  32.         else         s-=m;
  33.         str[ptr]='\0';
  34.         if (s==100) printf("Found: %s=%d\n",str,s); /*判断是否满足*/
  35.     }
  36.     return 0;
  37. }


  38. Found: 123-45-67+89=100
  39. Found: 12-3-4+5-6+7+89=100
  40. Found: 12+3+4+5-6-7+89=100
  41. Found: 123+4-5+67-89=100
  42. Found: 1+2+3-4+5+6+78+9=100
  43. Found: 12+3-4+5+67+8+9=100
  44. Found: 1+23-4+56+7+8+9=100
  45. Found: 1+2+34-5+67-8+9=100
  46. Found: 1+23-4+5+6+78-9=100
  47. Found: 123+45-67+8-9=100
  48. Found: 123-4-5-6-7+8-9=100
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
5 [报告]
发表于 2013-12-25 18:01 |只看该作者
  1. def sum100():
  2.     d = ('', '+', '-')
  3.     for i in range(3**8):
  4.         s = '1'
  5.         for j in range(2, 10):
  6.             s += d[i%3] + str(j)
  7.             i //= 3
  8.         s += '==100'
  9.         if eval(s):
  10.             print(s)
  11. if __name__ == "__main__":
  12.     sum100()
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
6 [报告]
发表于 2013-12-25 18:16 |只看该作者
本帖最后由 ssfjhh 于 2013-12-25 20:00 编辑
  1. function sum100 ()
  2.     local d = {[0]='', '+', '-'}
  3.     for i = 1, 3^8 do
  4.         local s = '1'
  5.         for j = 2, 9 do
  6.             s = s .. d[i%3] .. j
  7.             i = math.floor(i/3)
  8.         end
  9.         s = s .. ' == 100'
  10.         r = loadstring('return ' .. s)
  11.         if r() then
  12.             print(s)
  13.         end
  14.     end
  15. end

  16. sum100()
复制代码

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
7 [报告]
发表于 2013-12-26 09:21 |只看该作者

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
8 [报告]
发表于 2013-12-26 10:35 |只看该作者
我也写一个吧,抛砖引玉
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     for( unsigned i=0; i<3*3*3*3*3*3*3*3; ++i )
  5.     {
  6.         char record[18] = "";
  7.         int record_len = 0;

  8.         int num = 0;
  9.         int tmp = 0;
  10.         int op = +1;

  11.         for( unsigned j=1,k=i; j<9; ++j,k/=3 )
  12.         {
  13.             record[record_len++] = '0'+j;
  14.             tmp = tmp*10 + j;
  15.             if( k%3 == 0 ) continue;

  16.             record[record_len++] = '+' + k%3*2-2;
  17.             num += tmp*op;
  18.             tmp = 0;
  19.             op = 3 - k%3*2;
  20.         }

  21.         if( num+(tmp*10+9)*op == 100 )
  22.             printf( "%*s9 = 100\n", record_len, record );
  23.     }

  24.     return 0;
  25. }
复制代码

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
9 [报告]
发表于 2013-12-26 11:07 |只看该作者
3进制 分分钟搞定

论坛徽章:
1
丑牛
日期:2013-09-29 19:04:50
10 [报告]
发表于 2013-12-26 11:39 |只看该作者
一直以来,总感觉程序员的思维很奇葩
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP