原创
加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。
此题思路很简单,有48个‘+’号,题目要求将其中两个不相邻的 ‘+’ 号变成 ‘*’ 号后式子得出的结果是2015.
从第1个 ‘+’ 号开始遍历,依次将第1~46个 ‘+’ 号变成 ‘*’ 号,定位好第一个 ‘+’ 号后,定位第二个 ‘+’ 号,
即从第一个 ‘+’ 号后定位第二个 ‘+’ 号(注意第一个 ‘+’ 号前面不能是 10 )。定位好两个 ‘+’ 号后判断式
子值是否等于2015,等于跳出循环,否则继续循环。
#include
int main()
{
int i;
int s1=0;
int s2=0;
int total=0;
int j;
for(i=1;i<=46;i++) //i,j值不能变
{
if(i==10)
continue;
s1=i*(i+1); //第一个*值
for(j=i+2;j<=48;j++)
{
s2=j*(j+1); //第二个*值
int vari;
for(vari=1;vari<=49;vari++)
{
if( vari!=i && vari!=i+1 && vari!=j && vari!=j+1 )
total=total+vari;
}
total=total+s1+s2;
if(total==2015)
{
printf("%d",i);
return 0;
}
else
{
total=0;
continue;
}
}
}
printf("%d",i);
return 0;
}
后段代码思路是相同的,是自己后面复习重新敲的。
#include
int flag=0;
int ff=0;
int main(){
int i=0;
int j=0; //j代表第一个*前面的数字
int z=0; //z代表第二个*前面的数字
int total=0;
for(j=1;j<=46;j++){ //定位第一个*
if(j==10){
continue;
}
for(i=1;i<=49;i++){
if(i==j){ //定位好第一个*
total+=i*(i+1);
int i_t=0;
while(i_t!=i+2){
i_t++;
}
int total_=total; //备份第一阶段的总值
int i_tt=i_t; //备份第一阶段的后值
for(z=j+2;z<=48;z++){ //定位好第二个*
for(i_t=i_tt;i_t<=49;i_t++){
if(i_t==z){
total+=i_t*(i_t+1);
i_t++;
}
else{
total+=i_t;
}
}
if(total==2015){
printf("%d",j);
flag=1;
break;
}
else{
total=total_;
}
}
ff=1;
}
else{
total+=i;
}
if(flag==1){
break;
}
if(ff==1){
total=0;
ff=0;
break;
}
}
if(flag==1){
break;
}
}
return 0;
}
答案:16
13:25:54
2018-05-15