• C语言中关于POW在不同状态下四舍五入的解决方法


     这是今天作业中的一个代码:

    #include <stdio.h>
    #include<math.h>
    int main()
    {
    printf("请输入一个整数:");
    int c,a,x,d,f,i,mix;
    scanf("%d",&a);
    if(a>999999999)
    {
    printf("越界!");
    return 0;
    }
    c=a;
    printf("它的逆序输出为:");
    mix=0;
    while(c!=0)
    {
    d=c%10;
    c=c/10;
    printf("%d",d);
    mix++;
    }
    printf(" 它是一个%d位数 ",mix);
    x=(int)(pow(10,mix-1));
    printf("它的各位数字为:");
    do
    {
    f=a/x;
    a=a%x;
    x=x/10;
    printf("%d ",f);
    }
    while(x!=0);
    return 0;
    }

    但是在实际运行中出现了错误,也就是“吞数字“”的现象。为了查找错误,经基友提醒,在x=(int)(pow(10,mix-1))后加了一个printf语句,来检查输出的x值。结果是这样的:

    请输入一个整数:123
    它的逆序输出为:321
    它是一个3位数
    99
    它的各位数字为:1 2

    对,看见了吗,我本来想要的x值是100,但是这里进行了舍去,变成了99,那么接下来的程序就会少走一步,即最后的数字不会被计算并读取。当然不管怎么说这样的程序都是不健壮的,还需要修改。

    既然是舍入的话,那么会出现+1,-1还有合适共三种情况,我们来给这个一个判断

    -1,9999,能整除9;正好,10的倍数,一定能整除10

    写一个if语句进行判断:

    if(x%9==0)  x=x+1;

    if(x%10==0)  x=x;

    但是x=1时该怎么办?结果是1,一定会进入第三种情况,此时程序出现错误。解决方法很简单if   (x%10==0||x==1)  x=x;

    但是即使是这样也被老师批了一顿T^T,理由是程序太过复杂(明明只有42行啊!),但是老师说我们还是要尽可能的精简。。。这体现了算法的优劣。同样的程序,我用if循环也可以写出来,但是那样的程序很不好,判断条件太多,语句也太多,能算出来,但是你能说它好吗?当然不能。之前有一个输出100000以内素数的程序,老师强制规定程序的运行时间不能超过1秒,那就必须用开平方的形势,不开方也能算,但是时间是6秒多。算了,说多了,继续我们这个程序。这里的强制类型转换是在pow后,也就是先进行平方运算再转换,那么,我们直接在pow后加一个0.5,如果本来是要舍去的加上0.5就会取入,99会成100.这样不就不用对x的值进行判断再转换了吗?

    x=(int)(pow(10,mix-1)+0.5);省了3行,而且算法更优秀

  • 相关阅读:
    jvm理论-运行时数据区
    java nio-理解同步、异步,阻塞和非阻塞
    真正的mybatis_redis二级缓存
    扩展 DbUtility (1)
    DbUtility v3 背后的故事
    DbUtility v3
    Jumony Core 3,真正的HTML引擎,正式版发布
    新项目,WebTest
    面试经验总结,每个求职者应该具有的职业素养
    mkdir()提示No such file or directory错误的解决方法
  • 原文地址:https://www.cnblogs.com/wxy990118/p/6001596.html
Copyright © 2020-2023  润新知