1. 程式人生 > >c 實現int sqrt(int x)函式的細節討論

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 sqrtint 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語言中absint varname和fabsdouble 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("