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

#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("\n它是一个%d位数\n",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行,而且算法更优秀

C语言中关于POW在不同状态下四舍五入的解决方法的更多相关文章

  1. 关于真机调试DDMS中的data文件夹打不开的解决方法

    关于真机调试DDMS中的data文件夹打不开的解决方法 今天在开发的时候需要导出程序中的数据库文件查看数据,数据库文件默认就在/data/data/应用包名/databases/数据库名 这个路径下, ...

  2. Node.js中针对中文的查找和替换无效的解决方法

    Node.js中针对中文的查找和替换无效的解决方法.   //tags的值: tag,测试,帖子 var pos1 = tags.indexOf("测"); //这里返回-1 ta ...

  3. C语言中判断int,long型等变量是否赋值的方法

    博主这段时间在写一些C程序的代码,由于以前对C不是了解很多,故遇到很多瓶颈,当然,其中也有很多有趣的方法可以利用以解决这些难题,下面这个问题就是博主遇到的一个麻烦. 声明了 int ,long 型等局 ...

  4. 十六 在沉睡中停止(在sleep() 状态下停止线程)

    1 如果线程在sleep()状态下停止线程,会是什么效果? 答案: 如果在sleep状态下停止某一线程,会进入sleep的catch块中, 抛出InterruptedException 异常,并且清除 ...

  5. C语言-人狼羊菜问题-最容易看懂的解决方法及代码

    题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

  6. CLOSE_WAIT状态的原因与解决方法 --转

    转自:http://blog.chinaunix.net/uid-20357359-id-1963662.html 这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司 ...

  7. CLOSE_WAIT状态的原因与解决方法(转载留自己看)

    这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司竟然都面到到了这个问题,不得不使我开始关注这个问题.说起CLOSE_WAIT状态,如果不知道的话,还是先瞧一下TCP ...

  8. 在VS中使用Boost库出现Macro redefinition错误的解决方法(warning C4005)

    最近使用Boost库做多线程开发,可视在vs中编译工程师总是遇到Macro redefinition错误,类似下面的错误描述 1>c:\program files (x86)\microsoft ...

  9. VS2019中scanf返回值被忽略的问题及其解决方法

    目录 [问题](#昨天在使用Visual Studio 2019编写C语言程序时遇到了scanf返回值被忽略问题) 问题原因 方法① 方法② 方法③ 方法④ 昨天在使用Visual Studio 20 ...

随机推荐

  1. web系统登陆页面增加验证码

    传统登陆页面中包含两个输入项: • 用户名 • 密码有时为了防止机器人进行自动登陆操作,或者防止恶意用户进行用户信息扫描,需增加动态验证码功能.此时,登陆页面中包含了三个输入项: • 用户名 • 密码 ...

  2. PHP 获取两个日期之间的日期数组/月份数组

    function getEmptyArr($s_time,$e_time,$type){ $tmp = array(); if($type=='day'){ $s_time = strtotime($ ...

  3. iOS 保持界面流畅的技巧

    http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

  4. Qt之创建桌面和开始菜单快捷方式

    将安装好的酷狗拷贝到C:\data目录中 1.创建桌面快捷方式 QFile::link("C:/data/KuGou.exe", QStandardPaths::writableL ...

  5. 去掉无用的多余的空格(string1.前后空格,2.中间空格)

    1.使用NSString中的stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]方法只是去掉左右两边的空格: ...

  6. POI获取excel单元格红色字体,淡蓝色前景色的内容

    如果是Microsoft Excel 97-2003 工作表 (.xls) if(31 == cell.getCellStyle().getFillForegroundColor()) //判断单元格 ...

  7. C#开源系统大汇总(个人收藏)

    C#开源系统大汇总 一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖 ...

  8. 【leedcode】longest-substring-without-repeating-characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  9. git-credential-winstore.exe": No such file or directory

    $ git push -u origin master\"D:/GitExtensions/GitCredentialWinStore/git-credential-winstore.exe ...

  10. 鼠绘漫画 for wp8.1

    技术规格总结: 这个APP 总体上是下载图片的一个APP 所以对图片的查看&控制上需要一定功力,至少有一个稳定的缩小,放大的图片控件. 搭载WP系统的手机,内存上大部分不是很大,所以内存的控制 ...