c 實現int sqrt(int x)函式的細節討論
題目描述
分析
注意該函式返回的資料型別,是int。那麼我們應用二分查詢即可實現。細節討論
於是我便寫了如下所示的程式碼,然而執行超時了。
int mySqrt(int x) {
int low=0;
int high=x;
int mid,product;
while(low<=high){
mid=(low+high)/2;
product=mid*mid;
if(product==x)
break;
else if(product<x)
low=mid +1;
else
high=mid-1;
}
if(mid*mid>x)
return mid-1;
else
return mid;
}
來看超時的案例說明,
那麼問題來了,這麼簡單的一個程式碼怎麼還會超時呢?程式碼邏輯沒有錯呀?
最終發現造成超時的真正原因是值溢位。
來看下圖的測試案例,
對於數23456789,將它迴圈除2的結果是11728394、5864197、…,怎麼會有8399098如此大的執行結果呢?原因在這句程式碼,product=mid*mid; 兩個大數相乘值溢位了,每次都溢位,直到不滿足low<=high
所以,我們應該謹慎使用乘法,留意是否會有溢位情況發生。若有的話,可以把乘法換成除法防止溢位。
將乘法替換為除法後的程式碼如下,
int mySqrt(int x) {
int low=1;
int high=x;
int mid;
if(x==0)
return 0;
while(low<=high){
mid=low+(high-low)/2;
if(mid==x/mid)
break;
else if(mid<x/mid)
low=mid +1;
else
high=mid-1;
}
if(mid>x/mid)
return mid-1;
else
return mid;
}
基於同樣‘防止溢位’的考慮,把mid=(low+high)/2;改為mid=low+(high-low)/2;會更安全。
小問題,大警醒,所以寫下此文。
相關推薦
c 實現int sqrt(int x)函式的細節討論
題目描述 分析 注意該函式返回的資料型別,是int。那麼我們應用二分查詢即可實現。 細節討論 於是我便寫了如下所示的程式碼,然而執行超時了。 int mySqrt(int x) {
Untiy中用C#實現TCP通訊(Socket通訊)服務端與客戶端皆可
簡而言之,TCP通訊原理大家可以從各種網路文獻上找到,這裡不做贅述。 只提出C#實現TCP通訊的一般方法和常用程式碼工具供第一次接觸TCP通訊的玩家參考,老玩家繞道。。。 為了方便大家理解我的程式碼,會適當提及通訊遠離。 1、建立服務端,TCP連線的基本: using U
Android呼叫C++實現共享記憶體(Native層)
MemoryFile是java層封裝的介面,它實現共享記憶體主要呼叫瞭如下函式: int fd = open("/dev/ashmem",O_RDWR); ioctl(fd, ASHMEM_SET_NAME,name); ioctl(fd,ASHMEM_SET
C++:實現socket通訊(TCP/IP)例項
首先宣告,博主之前從來沒有寫過通訊方面的東西,這次之所以寫這個是因為專案需要,因此本文主要介紹一個使用C++語言及Socket來實現TCP/IP通訊的例項,希望可以幫助入門者。 一、什麼是TCP/IP? TCP提供基於IP環境下的資料可靠性傳
C++實現原型模式(複製簡歷)
本程式碼實現了大話設計模式上覆制簡歷; 1.克隆物件比直接建立物件的優點在於,克隆是將原有物件的行為屬性帶到了新的物件中。 2.C++沒有克隆方法,要克隆一個物件,需要藉助拷貝建構函式來實現。拷貝建構函式中實現拷貝物件有淺拷貝和深拷貝: 淺拷貝是指物件複製時,只是對於物件中
C++實現md5加密(相容中文)
說明:由於呼叫了windows api來對中文進行了處理,所以暫僅支援windows #include <iostream> #include <windows.h> using namespace std; typedef unsigned cha
C++ 實現字串類(過載運算子)
CNString.h:#include <iostream> #include <cstring> #ifndef CNSTRING_H #define CNSTRING_H
“C”實現掃雷遊戲(優化版)
指點 com C4D 根據 位置 菜單 sig https shadow 完成掃雷程序,並進行以下優化:①第一次下子,不炸死。(如果第一次掃到雷區,則將其置為無雷區,為保證雷的數目不變,再次隨機布一顆雷)?②坐標周圍沒雷,可以實現展開。思路:1、設置遊戲區域(10x10,考
C++實現string.replace(字串替換)
#include "stdafx.h" #include <iostream> #include <string
C語言中abs(int varname)和fabs(double varname)的區別
cited from:http://hi.baidu.com/onlymeteor/item/9ef60791efc09ff12916479a abs和fabs,abs是整數取絕對值,而fabs是指浮點數取絕對值 函式名: fabs 功 能: 返回浮點數的絕對
100行代碼實現最簡單的基於FFMPEG+SDL的視頻播放器(SDL1.x)【轉】
工程 全屏 升級版 gin avcodec ive 系列文章 相同 hello 轉自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版權聲明:本文為博主原創文章,未經博主允許不得轉載。
c語言實現按層次(廣度優先)非遞歸遍歷二叉鏈樹
child str sizeof att col std 二叉樹 頭結點 oot 1 #include<stdio.h> 2 #include<conio.h> 4 #include<malloc.h> 5 typedef cha
c++實現線性迴歸(高斯消元)(附python實現)
前言 寫這次blog的契機是上次筆試的時候,遇到了這個問題 當時以為numpy庫是可以用的,就先寫了個python版,結果並不能用。。 最後憤然寫了個c++版 不過最後一個小問題導致我差了兩分鐘沒交上去程式碼,所以這一版原始碼只是通過了案例但沒有提交ac。。
C語言和cuda C實現的程式碼(教科書上的格式)
一般教科書都這麼寫,感覺不如STL的好。記下以便查閱。 #include <cuda_runtime.h> #include <iostream> #include <stdio.h> __global__ void vector_add_gpu_2(fl
C#實現遠端開機(區域網測試通過)
首先介紹相關知識。 UDP協議 UDP 是User Datagram Protocol的簡稱, 中文名是使用者資料報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。 下面是UDP與TCP的一些區別
cocos2d-x實現一個PopStar(消滅星星)遊戲的邏輯分析及原始碼
前言 說起PopStar這個遊戲,或許很多人都不知道是啥,但是如果說起消滅星星的話,可能就會有很多人恍然大悟,原來是它。那麼,這個消滅星星長得什麼樣子呢?我們用一張圖來看看: emmm,是的,具體來說,長得就是這樣,我們通過點選圖片上某一個顏色的星星塊,如果,這個顏色塊周圍存在和他相
用c語言實現簡易通訊錄(連結串列)
首先,這是本人第一次寫部落格。不當之處,望請見諒!(腦補一個doge) 最近在學習C語言,並實現了 下面連結中 簡易通訊錄的功能。區別是:我是用連結串列實現了其所有功能。並增加了檔案儲存模組! 本人初來乍到,c功底不是很紮實,且是第一次用c寫小專案,雖然實現了所有功能,但程式碼中定會有很多需
C#實現呼叫印表機(列印字串、列印繪圖、列印圖片),還差列印水晶報表
C#實現呼叫印表機(列印字串、列印繪圖、列印圖片),還差列印水晶報表 目的:呼叫印表機的使用 缺陷:列印的物件不全(還差列印水晶報表),不能實現在外掛繪圖板中畫什麼列印什麼 改進:同缺陷,希望朋友們能提供解決方案,和提供改進方案,請留言謝謝。 C# winfrom 介面(純功能測
C/C++實現HTTPS通訊(抓取百度頁面)
#include <WINSOCK2.H> #include <openssl/ssl.h> #include <openssl/err.h> #include <iostream> #include <sstream> #prag
C語言實現快速排序(遞迴)
#include<stdio.h> void Split(int left,int a[],int right); int Quicksort(int left,int a[],int right); int main() { int N; scanf("