7-1 到底有多二(15 分)
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336
是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N
。
输出格式:
在一行中输出N
犯二的程度,保留小数点后两位。
输入样例:
-13142223336
输出样例:
81.82%
这确实是一道水题,然而由于我眼高手低,再加上后来时间不够,才没有真正理解这道题目的意思,说白了这道题我还是没有做出来,绝望到怀疑人生,不过现在重振旗鼓,继续看题。首先,要注意的第一点:是负数加0.5倍,是偶数加1倍,是乘法,不是加法,在做题的过程中,无论我再怎么运行,我的结果都是正确的,然而我的结果正确只是针对题目给的这一个例子,我把乘法写成了加法,小学数学没学好;第二点:N是一个不超过50位的整数,用long long是不可以的,long long的整数范围要比50小(参考网址 http://blog.csdn.net/mafuli007/article/details/7325510);第三点:采用字符串数组存放的时候,当是负数时,负号会占用一位,因此当是负数时,要把len-1;
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string s;
int len,j,m=0;
double i=1.0;
cin>>s;
if(s[0]=='-')
i=i*1.5;
len=s.size();
// cout<<len<<endl;
if((s[len-1]-48)%2==0)
i=i*2;
for(j=0;j<len;j++)
{
if(s[j]=='2')
{
m++;
}
}
if(s[0]=='-')
len--;
//cout<<m<<endl;
double w=(double)((double)m/len)*i*100;
printf("%.2lf%%\n",w);
return 0;
}
/*错误代码: long long范围不够 */
/*
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int m=0,n=0;
void p(long long N)
{
int s;
while(N)
{
s=N%10;
if(s==2)
{
m=m+1;
}
n++;
N=N/10;
}
}
int main()
{
long long N;
double i=1.0;
cin>>N;
if(N<0)
i=i*1.5;
if(N%2==0)
i=i*2;
if(N<0)
p(-N);
else p(N);
// cout<<m<<" "<<n<<endl;
// cout<<i<<" "<<endl;
double w=(double)((double)m/(double)n)*i*100;
printf("%.2lf",w);
cout<<"%"<<endl;
return 0;
}
*/