欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

加法变乘法——第六届蓝桥杯C语言B组(省赛)第六题

程序员文章站 2022-03-17 12:21:50
原创 加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015就是符合要求的答案。 请你寻找另外一个可能的答案,并把位置靠前的那个 ......

原创


加法变乘法

我们都知道: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<stdio.h>

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<stdio.h>

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