1到1/50的分数相加
2016-03-14 17:53
441 查看
看到一题:1+1/2+1/3+...+1/50,for循环实现;
第一想法,不就是通分嘛,有什么难的,于是开写。
注意到我用了long long,具体long long与_int64有啥区别,请参考http://blog.csdn.net/shiwei408/article/details/7463476
其实,我一开始是用int的,就是这个样子了,注意到,正确答案也就没几个了,为啥呢?
![](http://img.blog.csdn.net/20160314180353473)
肯定是int的范围太小,有操作数越界了,然后我用unsigned int, long ,unsigned long,都不对
于是我祭出了大杀器——long long,说实话之前从没请过这位仁兄出场;
然后运行下
![](http://img.blog.csdn.net/20160314181044663)
其实会发现,最后几位的结果还是不对啊,这...这...我就不知道,这个时候我重新审视这个过程,你以为你的极限是long,但是32位下,long与int其实都是4个字节,你以为unsigned一下就行了,其实不过是表示正数翻了倍而已,long long你又以为应该行了吧,但是这只是到1/50,如果到1/100呢,到1/1000呢,如果按照这种方法,总会有突破范围的那个数。
盗用一张图,来说下这些基本数据类型的范围。
![](http://img.blog.csdn.net/20160314182441294)
所以,不要以为你以为就是你以为的。至于其他的实现,我再想想...
第一想法,不就是通分嘛,有什么难的,于是开写。
#include "stdafx.h" #include <iostream> using namespace std; //最大公约数 long long maxgy( long long a,long long b){ long long tmp; while (a%b) { tmp = b; b = a%b; a = tmp; } return b; } //最小公倍数 long long mingb(long long a, long long b){ long long tmp = maxgy(a,b); tmp = a*b/tmp; return tmp; } typedef struct { long long a ; char ch; long long b; void show(){ cout<<a<<ch<<b<<endl; } }fraction; fraction add_fraction(fraction f1,fraction f2){ long long j , k, l; fraction f; f.ch ='/'; f.b=mingb(f1.b,f2.b); j = f.b/f1.b; k = f.b/f2.b; f.a = f1.a*j+f2.a*k; l = maxgy(f.a,f.b); f.a/=l; f.b/=l; return f; } int _tmain(int argc, _TCHAR* argv[]) { fraction f1,f2; f1.a=1; f1.ch='/'; f1.b=1; f2.a=1; f2.ch='/'; f2.b=1; for (int i =1;i<50;i++) { f2.b = i+1; f1=add_fraction(f1,f2); f1.show(); } return 0; }
注意到我用了long long,具体long long与_int64有啥区别,请参考http://blog.csdn.net/shiwei408/article/details/7463476
其实,我一开始是用int的,就是这个样子了,注意到,正确答案也就没几个了,为啥呢?
肯定是int的范围太小,有操作数越界了,然后我用unsigned int, long ,unsigned long,都不对
于是我祭出了大杀器——long long,说实话之前从没请过这位仁兄出场;
然后运行下
其实会发现,最后几位的结果还是不对啊,这...这...我就不知道,这个时候我重新审视这个过程,你以为你的极限是long,但是32位下,long与int其实都是4个字节,你以为unsigned一下就行了,其实不过是表示正数翻了倍而已,long long你又以为应该行了吧,但是这只是到1/50,如果到1/100呢,到1/1000呢,如果按照这种方法,总会有突破范围的那个数。
盗用一张图,来说下这些基本数据类型的范围。
所以,不要以为你以为就是你以为的。至于其他的实现,我再想想...
相关文章推荐
- Unity3d 5.0 UI穿透判断
- Java异常的栈轨迹(Stack Trace)
- 前端开发框架对比
- BlockingQueue
- 解决vim无法返回上次的位置
- Android图片轮播的实现总结
- Hello CSDN
- weblogic连接池重连机制不一定靠得住
- C语言回顾与再学习——setbuf
- 源码安装 mysql 5.5.20升级到mysql 5.6.25
- 2016SDAU课程练习一1004
- Java源码阅读之PriorityBlockingQueue
- asp.net使用for循环实现Datalist的分列显示功能
- [Android]一个干净的架构(翻译)
- Head First设计模式之装饰者模式(Decorator Pattern)
- UIWebView 与 JavaScript 的交互
- Linux下安装Nginx详细图解教程
- iOS开发笔记--描边label
- C#中数组、ArrayList和List三者的区别
- 自定义ViewGroup的总结(侧滑特效)