鱼C论坛

 找回密码
 立即注册
查看: 2430|回复: 10

[技术交流] 加法变乘法

[复制链接]
发表于 2017-12-8 11:21:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题看图 ,这个题实在不会做了怎么让他加着加着突然乘然后继续一直到49个数字求大神指导
QQ图片20171208111257.png
QQ图片20171208111302.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-8 12:08:02 | 显示全部楼层
楼主大人,这一题使用穷举的方法就可以很容易的求解出来
首先题目要求是将两个不连续的加号换成乘号,我们就可以确定我们需要使用两重循环,第一重循环是找出第一个“加号换乘号”,第二重循环是找出第二个“加号换乘号”,然后分别计算每两次变换之后的最终结果,如果和2015相等,那么就是目标结果。
程序如下,楼主大人如果看不懂可以问在下哦
  1. #include<iostream>

  2. using namespace std;

  3. int main(void){
  4.         int sum = 1225;//原加法结果
  5.        
  6.         for(int i = 2; i <= 47; i++){
  7.                 //把其中一个不相邻的加号变成乘号,计算最终结果
  8.                 int temp = sum-(i + (i-1)) + (i * (i-1));
  9.                
  10.                 for(int j = i + 2; j <= 49; j++){
  11.                         //把第二个加号变成乘号,计算结果
  12.                         int temp2 = temp - (j + (j-1)) + (j * (j-1));

  13.                         if(temp2 == 2015){
  14.                                 printf("the first num is %d\n", i-1);
  15.                         }
  16.                 }
  17.         }
  18. }
复制代码

程序执行结果如下,根据题目要求,我们很容易知道,本题结果是16
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-8 13:06:04 | 显示全部楼层
tailor_long 发表于 2017-12-8 12:08
楼主大人,这一题使用穷举的方法就可以很容易的求解出来
首先题目要求是将两个不连续的加号换成乘号,我们 ...

里面2个for循环的内容没明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 15:28:53 | 显示全部楼层
本帖最后由 tailor_long 于 2017-12-8 15:31 编辑
解圣洁 发表于 2017-12-8 13:06
里面2个for循环的内容没明白


楼主你好,
  1. for(int i = 2; i <= 47; i++){
  2.                 //把其中一个不相邻的加号变成乘号,计算最终结果
  3.                 int temp = sum-(i + (i-1)) + (i * (i-1));
  4.                 for(int j = i + 2; j <= 49; j++){
  5.                         //把第二个加号变成乘号,计算结果
  6.                         int temp2 = temp - (j + (j-1)) + (j * (j-1));
  7.                         if(temp2 == 2015){
  8.                                 printf("the first num is %d\n", i-1);
  9.                         }
  10.                 }
  11.         }
复制代码

对于里面两层循环,意思是这样的。对于第一层循环,意思就是寻找遍历第一个乘号的位置
int temp = sum-(i + (i-1)) + (i * (i-1)); 这就话的意思就是当第(i-1)个加号换成乘号的时候,等式的结果是temp
然后当确定了第一个乘号的位置之后,我们进入第二层循环,因为两个乘号不能连着,所以我们初始化j = i + 2
然后int temp2 = temp - (j + (j-1)) + (j * (j-1));计算当第二个乘号确定了之后,等式的结果,然后进行判断也就是

  1. if(temp2 == 2015){
  2.         printf("the first num is %d\n", i-1);
  3. }//如果满足题目约束条件,那么就输出第一个乘号的位置
复制代码

楼主大人,我顺便写了一个测试程序,如果你上面看懂了,那就不要运行了,因为有点乱;
如果上面的看不懂的话,那么你就想一下 99乘法表的实现原理,我觉得都一样
就是确定了第一个乘号之后,例如将第一个加号改成乘号之后,第二层循环就是依次更改第三个加号、第四个加号、。。。、第48个加号为乘号,来算结果,如果都没有符合条件的
那么再回到第一层循环,更改第二个加号为乘号,,然后进入第二层循环,更改第四个、。。。为乘号,计算结果
、、、、、、、、、、、、、、、、、、、、、、、、、、、、测试程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
  1. #include<iostream>

  2. using namespace std;
  3. void print(int temp, int index1, int index2);

  4. int main(void){
  5.         int sum = 1225;//原加法结果
  6.        
  7.         for(int i = 2; i <= 7; i++){//这里我将数改小了一点,方便演示
  8.                 //把其中一个不相邻的加号变成乘号,计算最终结果
  9.                 int temp = sum-(i + (i-1)) + (i * (i-1));
  10.                 for(int j = i + 2; j <= 9; j++){
  11.                         //把第二个加号变成乘号,计算结果
  12.                         int temp2 = temp - (j + (j-1)) + (j * (j-1));
  13.                         print(temp2, i, j);//输出当前测试等式
  14.                         if(temp2 == 2015){
  15.                                 printf("the first num is %d\n", i-1);
  16.                         }
  17.                        
  18.                 }
  19.                 printf("\n");
  20.         }
  21.         return 0;
  22. }

  23. void print(int temp, int index1, int index2){
  24.         printf("当前等式: ");
  25.         for(int i = 1 ; i < 9; i++){
  26.                 if(i == index1-1 || i == index2-1){
  27.                         printf( "%d * ", i);
  28.                        
  29.                 }
  30.                 else{
  31.                         printf("%d + ", i);
  32.                 }
  33.         }
  34.         printf("%d = %d\n", i,temp);
  35. }
复制代码

捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-8 17:42:19 | 显示全部楼层
tailor_long 发表于 2017-12-8 15:28
楼主你好,

对于里面两层循环,意思是这样的。对于第一层循环,意思就是寻找遍历第一个乘号的位置

谢谢大佬我明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 17:45:11 | 显示全部楼层
解圣洁 发表于 2017-12-8 17:42
谢谢大佬我明白了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-8 19:01:30 | 显示全部楼层

大佬真的辛苦打这么多字这么用心 感动死
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-8 19:02:09 | 显示全部楼层
本帖最后由 解圣洁 于 2017-12-8 19:03 编辑

.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-12-8 19:04:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 19:31:00 | 显示全部楼层
解圣洁 发表于 2017-12-8 19:01
大佬真的辛苦打这么多字这么用心 感动死

交流学习,共同进步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 19:32:09 | 显示全部楼层

抱歉
不过有问题都可以在这上边提问,这里大牛好多的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 22:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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