本帖最后由 tailor_long 于 2017-12-8 15:31 编辑
楼主你好,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);
}
|