|
发表于 2017-12-8 15:28:53
|
显示全部楼层
本帖最后由 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);
- }
复制代码
|
-
|