为什么这段代码没有删除中间数字?

时间:2015-12-05 07:55:29

标签: c++

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int n,l=0,a,s,d,w;
    cin>>n;
    a=n;
    while(a!=0){
        l++;
        a=a/10;
    }
    if(l%2==0){
        s=n/pow(10,(l/2)+1);
        w=pow(10,(l/2)-1);
        d=n%w;
        } else{
        s=n/pow(10,l/2+1);
        w=pow(10,l/2);
        d=n%w;
    }
    cout<<s*(pow(10,(l/2)-1));
}

当我输入&#34; 12345&#34;它应该显示&#34; 1245&#34;,而是显示&#34; 120&#34;。为什么呢? 代码应该消除不均匀数字的中间数字,或偶数数字的两个中间数字,但数字的右侧(变量d)不能显示正确的数字。

3 个答案:

答案 0 :(得分:0)

d不是输出的一部分。因此,它的计算将不会显示。

if(l%2==0){
    s=n/pow(10,(l/2)+1);
    w=pow(10,(l/2)-1);
    d=n%w;
    } else{
    s=n/pow(10,l/2+1);
    w=pow(10,l/2);
    d=n%w;
    // if n == 12345, I get
    // s = 12
    // w = 100
    // d = 45
    // l = 5
}
cout<<s*(pow(10,(l/2)-1));
// outputs 120 (s * 10^ 1) == s * 10

我可以看到d没有使用,但还有什么意外

答案 1 :(得分:0)

您没有将d部分添加到上次计算中:
l应该针对偶数和奇数进行修改。

尝试:

if(l%2==0){
    s=n/pow(10,(l/2)+1);
    w=pow(10,(l/2)-1);
    d=n%w;
    l = l/2 - 1;
} else{
    s=n/pow(10,(l/2) + 1); 
    w=pow(10,l/2); 
    d=n%w; 
    l = l/2;
}
cout<<s * pow(10, l) + d<<std::endl;

答案 2 :(得分:0)

这是工作代码

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n,l=0,a,s,d,w, result;
    cin>>n;
    a=n;
    while(a!=0)
    {
        l++;
        a=a/10;
    }
    if(l%2==0)
    {
        s=n/ceil(pow(10,(l/2)+1));
        w=ceil(pow(10,(l/2)-1));
        d=n%w;
        result = s*(ceil(pow(10,(l/2-1))))+d;
    }
    else
    {
        s=n/ceil(pow(10,l/2+1));
        w=ceil(pow(10,l/2));
        d=n%w;
        result = s*(ceil(pow(10,(l/2))))+d;
    }
    cout<<result<<endl;
}

ceil过去常常使用pow处理double precision problem