您的位置:首页 > 其它

蓝桥杯B六-----加变乘

2016-03-16 11:10 162 查看
加法变乘法:

我们都知道:1+2+3+ ... + 49 = 1225

现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

比如:

1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015

就是符合要求的答案。

请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

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

简洁版的:先算出总和,然后再根据加变乘的情况加上和减去相应的数.

找到了两种解法,一种复杂一种简单.体会到了算法对程序的重要性.

#include <stdio.h>
int main()
{
int sum = 1225, tmp=0, res=0;
for(int i=2; i<=47; ++i) {
sum = 1225;
tmp = res = sum-i-(i-1)+i*(i-1);
//        printf("%d * %d  +", i-1, i);
for(int z=i+2; z<=49; ++z) {
res = tmp-z-(z-1)+z*(z-1);
//            printf("%d * %d  ", z-1, z);
//            printf("= %d \n\n", res);
if(res == 2015){
printf("true!!i is %d \n", i-1);
printf("true!!z is %d \n", z-1);
}

}
}
return 0;
}


第一种: 将这一串加数分类然后逐个去算最后求和
#include <iostream>
using namespace std;

int main()
{
int i=0,j=0;
int sum1=0,sum2=0,sum3=0;
int pro1,pro2;

for(i=1;i<=46;i++)//此处i的最大值应为46,但是到到48也没错误
{
if(i==1)
sum1=0;
if(i==2)
sum1=1;
if(i!=1 && i!=2)
sum1=i*(i-1)/2;//sum1 = (1+i-1)*(i-1-1+1)/2;

pro1 = i*(i+1);

for(j=i+2;j<=48;j++)//因为是两个不相邻的+号改为*号,所以j最近也要从i+2算起
{
if(j-i<=2)
{
sum2=0;
pro2=j*(j+1);
sum3=(j+51)*(48-j)/2;//sum3=(j+2+49)*(49-j-2+1)/2;
}
else if(j-i==3)
{
sum2=j-1;
pro2=j*(j+1);
sum3=(j+51)*(49-j)/2;//sum3=(j+2+49)*(49-j-2+1)/2;
}
else
{
sum2=(i+j+1)*(j-i-2)/2;//sum2=(i+2+j-1)*(j-1-i-2+1)/2;
pro2=j*(j+1);
sum3=(j+51)*(48-j)/2;//sum3=(j+2+49)*(49-j-2+1)/2;
}

if(sum1 + pro1 + sum2 + pro2 + sum3 == 2015)
cout<<i << " "<<j<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: