2018-03-CCF第一题跳一跳(1.0的错误已纠正,2.0如下)

题目大意如下:微信跳一跳游戏,输入1,2,,0三个数字;

1代表跳到了下一个盒子但不在中心,得分为1,总分加1;

2代表跳到了下一个盒子且在中心;根据上次的得分计算:如果上一次得分为1,那此次得分为2,总分加2分,如果上一次得分为2,那此次得分为4,总分加4;以此类推:如上一次得分为8分,这次又跳到了盒子中心,那此次得分为10分,总分加10;

0代表没有跳到盒子上,游戏结束。

-------------------------------------------------------------------------------------------------------

输入要求:一组整数(1,2,0),空格隔开,保证以0结尾,且一组数据有且只有一个0。

输入:1 1 2 2 1 1 2 2 2 0

输出:22

输出描述为:1+1+2+4+1+1+2+4+6= 22

-------------------------------------------------------------------------------------------------------

这是我的代码1.0(C++):(得分为0的版本)

#include <iostream>
using namespace std;
int main(){

    int n;//输入
    int first=1;//判断是否为第一个输入
    int ans=0;//输出的结果
    int p=0;//连续跳到中心点的次数

    while(n){
        cin>>n;
        if(n==1){//如果输入为1;
            ans++;
            first=0;//第一个输入的标志位记0;
            p=0;//未跳到中心点,p为0;
        }
        else if(n==2){//如果输入为2;
            if(first==1){//判断第一次是否跳到中心点
                ans=ans+2;
            }
            ++p;//次数累加
            ans=ans+2*p;//跳到中心点,结果累加
        }
    }
    cout<<ans;//输出结果
}

-------------------------------------------------------------------------------------------------------

这是我的1.0的测试输出:



-------------------------------------------------------------------------------------------------------

今天查成绩时候,发现这道题目CCF给了我0分。。。输出也都是对的呀,为什么会出现0分的情况呢??

请各位大佬赐教,方便日后改正!

分割线:-----------------------------------------------------------------------------------------------

2018年3月20日:

在大佬的帮助下,今天发现了这个错误:对于2 1 0的输入,对于2的情况,多做了一次的计算,导致输出为5,实际上是3;


-------------------------------------------------------------------------------------------------------

这是我修改后的代码2.0(C++)(在输入为2的处理上,避免了重复计算,加了一个else)

#include <iostream>
using namespace std;
int main(){

    int n;//输入
    int first=1;//判断是否为第一个输入
    int ans=0;//输出的结果
    int p=0;//连续跳到中心点的次数

    while(n){
        cin>>n;
        if(n==1){//如果输入为1;
            ans++;
            first=0;//第一个输入的标志位记0;
            p=0;//未跳到中心点,p为0;
        }
        else if(n==2){//如果输入为2;
            if(first==1){//判断第一次是否跳到中心点
                ans=ans+2;
                p++;
                first=0;
            }
            else{//处理第一次以后跳到中心点的问题
                ans=ans+2*(p+1);
                p++;
            }
        }
    }
    cout<<ans;//输出结果
}

-------------------------------------------------------------------------------------------------------

这是我的2.0的测试输出:


-------------------------------------------------------------------------------------------------------

确实很不应该,犯了这么低级的错误,还是自己的编程的基本功不够扎实,设置测试用例的时候,也是不够全面,以为通过了一些常见的测试就放松了警惕,变得麻痹大意,最后检查的时候也不用心,希望以后不会再犯吧。

因为这个致命的失误,可能导致自己以后没有机会再去敲代码了。再见了,NUDT。

ORZ。

-------------------------------------------------------------------------------------------------------

3.0版本(比较简洁,省去了判断是否为第一次的情况)

#include<iostream>
using namespace std;
int main(){
    int n;
    int ans=0;
    int point=0;
    while(1){
        cin>>n;
        if(n==0){
            break;
        }
        else if(n==1){
            ans++;
            point=0;
        }
        else if(n==2){
            ans=ans+2*(point+1);
            point++;
        }
    }
    cout<<ans;
    return 0;
}







  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值