加法变乘法
如题看图 ,这个题实在不会做了怎么让他加着加着突然乘然后继续一直到49个数字求大神指导 楼主大人,这一题使用穷举的方法就可以很容易的求解出来首先题目要求是将两个不连续的加号换成乘号,我们就可以确定我们需要使用两重循环,第一重循环是找出第一个“加号换乘号”,第二重循环是找出第二个“加号换乘号”,然后分别计算每两次变换之后的最终结果,如果和2015相等,那么就是目标结果。
程序如下,楼主大人如果看不懂可以问在下哦
#include<iostream>
using namespace std;
int main(void){
int sum = 1225;//原加法结果
for(int i = 2; i <= 47; i++){
//把其中一个不相邻的加号变成乘号,计算最终结果
int temp = sum-(i + (i-1)) + (i * (i-1));
for(int j = i + 2; j <= 49; j++){
//把第二个加号变成乘号,计算结果
int temp2 = temp - (j + (j-1)) + (j * (j-1));
if(temp2 == 2015){
printf("the first num is %d\n", i-1);
}
}
}
}
程序执行结果如下,根据题目要求,我们很容易知道,本题结果是16 tailor_long 发表于 2017-12-8 12:08
楼主大人,这一题使用穷举的方法就可以很容易的求解出来
首先题目要求是将两个不连续的加号换成乘号,我们 ...
里面2个for循环的内容没明白 本帖最后由 tailor_long 于 2017-12-8 15:31 编辑
解圣洁 发表于 2017-12-8 13:06
里面2个for循环的内容没明白
楼主你好,
for(int i = 2; i <= 47; i++){
//把其中一个不相邻的加号变成乘号,计算最终结果
int temp = sum-(i + (i-1)) + (i * (i-1));
for(int j = i + 2; j <= 49; j++){
//把第二个加号变成乘号,计算结果
int temp2 = temp - (j + (j-1)) + (j * (j-1));
if(temp2 == 2015){
printf("the first num is %d\n", i-1);
}
}
}
对于里面两层循环,意思是这样的。对于第一层循环,意思就是寻找遍历第一个乘号的位置
int temp = sum-(i + (i-1)) + (i * (i-1)); 这就话的意思就是当第(i-1)个加号换成乘号的时候,等式的结果是temp
然后当确定了第一个乘号的位置之后,我们进入第二层循环,因为两个乘号不能连着,所以我们初始化j = i + 2
然后int temp2 = temp - (j + (j-1)) + (j * (j-1));计算当第二个乘号确定了之后,等式的结果,然后进行判断也就是
if(temp2 == 2015){
printf("the first num is %d\n", i-1);
}//如果满足题目约束条件,那么就输出第一个乘号的位置
楼主大人,我顺便写了一个测试程序,如果你上面看懂了,那就不要运行了,因为有点乱;
如果上面的看不懂的话,那么你就想一下 99乘法表的实现原理,我觉得都一样
就是确定了第一个乘号之后,例如将第一个加号改成乘号之后,第二层循环就是依次更改第三个加号、第四个加号、。。。、第48个加号为乘号,来算结果,如果都没有符合条件的
那么再回到第一层循环,更改第二个加号为乘号,,然后进入第二层循环,更改第四个、。。。为乘号,计算结果
、、、、、、、、、、、、、、、、、、、、、、、、、、、、测试程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include<iostream>
using namespace std;
void print(int temp, int index1, int index2);
int main(void){
int sum = 1225;//原加法结果
for(int i = 2; i <= 7; i++){//这里我将数改小了一点,方便演示
//把其中一个不相邻的加号变成乘号,计算最终结果
int temp = sum-(i + (i-1)) + (i * (i-1));
for(int j = i + 2; j <= 9; j++){
//把第二个加号变成乘号,计算结果
int temp2 = temp - (j + (j-1)) + (j * (j-1));
print(temp2, i, j);//输出当前测试等式
if(temp2 == 2015){
printf("the first num is %d\n", i-1);
}
}
printf("\n");
}
return 0;
}
void print(int temp, int index1, int index2){
printf("当前等式: ");
for(int i = 1 ; i < 9; i++){
if(i == index1-1 || i == index2-1){
printf( "%d * ", i);
}
else{
printf("%d + ", i);
}
}
printf("%d = %d\n", i,temp);
}
tailor_long 发表于 2017-12-8 15:28
楼主你好,
对于里面两层循环,意思是这样的。对于第一层循环,意思就是寻找遍历第一个乘号的位置
谢谢大佬我明白了 解圣洁 发表于 2017-12-8 17:42
谢谢大佬我明白了
{:5_92:} tailor_long 发表于 2017-12-8 17:45
大佬真的辛苦打这么多字这么用心 感动死 本帖最后由 解圣洁 于 2017-12-8 19:03 编辑
. tailor_long 发表于 2017-12-8 17:45
大佬能加你qq吗{:5_96:} 解圣洁 发表于 2017-12-8 19:01
大佬真的辛苦打这么多字这么用心 感动死
{:10_256:}交流学习,共同进步{:10_261:} 解圣洁 发表于 2017-12-8 19:04
大佬能加你qq吗
抱歉{:10_254:},
不过有问题都可以在这上边提问,这里大牛好多的{:5_93:}
页:
[1]