15年蓝桥杯第6题

题意:

加法变乘法

我们都知道:1+2+3+ ... + 49 = 1225、现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015。比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

注意:需要你提交的是一个整数,不要填写任何多余的内容。

思路:很简单知道是把一共C(48, 2)对加号变成乘号,除去连在一起的情况,检验得到符合要求的就可以了。
问题是。代码实现?1.两层循环可以做到?2.怎么检验?每次都是计算原式吗?讲道理是可以这样的。

【做完之后发现确实很水。然而因为开心自己想的,还是 来一篇水水的博文吧~~~】

附right代码:ans = 16

 1 /*
 2  加法变乘法
 3 
 4  我们都知道:1+2+3+ ... + 49 = 1225、现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015。比如:
 5  1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015就是符合要求的答案。
 6  请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
 7 
 8  注意:需要你提交的是一个整数,不要填写任何多余的内容。
 9 
10  思路:很简单知道是把一共C(48, 2)对加号变成乘号,除去连在一起的情况,检验得到符合要求的就可以了。
11  问题是。代码实现?1.两层循环可以做到?2.怎么检验?每次都是计算原式吗?讲道理是可以这样的。
12  */
13 
14 #include <stdio.h>
15 #include <string.h>
16 #include <iostream>
17 using namespace std;
18 
19 int num;
20 int ans;
21 
22 bool check(int i, int j) {
23     int temp = num;
24     int num1 = i + i+1;
25     int num2 = j + j+1;
26     temp -= (num1 + num2);
27     num1 = i * (i+1);
28     num2 = j * (j+1);
29     temp += (num1 + num2);
30     if (temp == 2015)
31         return true;
32     else return false;
33 }
34 
35 int main() {
36     num = 0;
37     ans = 0;
38 
39     for (int i=1; i<=49; ++i) {
40         num += i;
41     } // 初始值
42 
43     for (int i=1; i<=48; ++i) {
44         for (int j=i+2; j<=48; ++j) {
45             if (check(i, j) && i != 10) {
46                 ans = i;
47                 break;
48             }
49         }
50         if (ans != 0) {
51             break;
52         }
53     } // C(48, 2)中所有不相连的任意两个位置检查是否符合情况。
54 
55     printf("%d
", ans);
56     return 0;
57 }
View Code
原文地址:https://www.cnblogs.com/icode-girl/p/5233643.html