zoukankan      html  css  js  c++  java
  • 加法变乘法——第六届蓝桥杯C语言B组(省赛)第六题

    原创


    加法变乘法

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

  • 相关阅读:
    类的继承
    面向对象的编程
    Python的模块
    ES6_12_Set和Map数据结构以及for of循环
    ES6_11_字符串、数值、数组、对象扩展
    ES6_09_Generator函数
    ES6_08_Iterator遍历器
    ES6_07_Symbol属性
    ES6_05_三点运算符和形参默认值
    Sqlstate解释
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9039483.html
Copyright © 2011-2022 走看看