L1-017 到底有多二

文章介绍了两种方法计算整数的犯二程度,一种是使用longlong类型存储并处理负数和位数,另一种是利用string存储每个位数进行判断。重点在于处理大数和特殊情况,如负数和偶数对犯二程度的影响。
摘要由CSDN通过智能技术生成

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

输入格式:

输入第一行给出一个不超过50位的整数N

输出格式:

在一行中输出N犯二的程度,保留小数点后两位。

输入样例:

-13142223336

输出样例:

81.82%
第一次的做法:用long long存储N

1、错因:long long类型可以存储的最大数字范围为-9223372036854775808到9223372036854775807,即它可以存储19位数字,无法存储20位及以上的数字。

2、求位数的方法:while(m!=0){ m=m/10;len++;}

3、求个位的方法:t=m%10;

4、去负号/求绝对值的方法:m=abs(n);

5、保留几位小数的方法:cout<<fixed<<setprecision(2)<<sum;

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
    long long n,m;
    cin>>n;
    float a=1;
    float b=1;
    if(n<0) a=1.5; //若为负数乘1.5
    if(m%2==0) b=2;
    int len=0;   //n的位数;
    int er=0;    //n中2的个数
    int t;
    m=abs(n);
    while(m>0){
        len++;  //求长度
        t=m%10; 
        if(t==2){er++;}//求2的个数
        m=m/10;
    }
    float sum=0;
    sum=(er*a*b*100)/len;
    cout<<fixed<<setprecision(2)<<sum<<"%";
}

 

测试结果:当输入位数大于19位时总会输出一样的数(如图) 

 

第二次做法:用string存储N的每位数

判断偶数的方法:s[len-1]-'0'和2取余为0;

 易错点:当N为负数时,最终位数len要减1

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
    string s;
    getline(cin,s);       //存储N
    float a=1.0;
    float b=1;
    int er=0;                 //er记录n中2的个数
    int len=s.size();         //len为N的位数(负数要-1)
    for(int i=0;i<len;i++){
        if(s[i]=='2') er++;   //求N中2的个数
    }
    float sum=0;
    int t=s[len-1]-'0';
    if(t%2==0) b=2;             //如果N为偶数
    if(s[0]=='-') {a=1.5;len--;}//如果为负数
    sum=(er*a*b*100)/len;
    cout<<fixed<<setprecision(2)<<sum<<"%";
}

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值