1. 程式人生 > >習題4-5 IP網路 UVa1590

習題4-5 IP網路 UVa1590

#include <stdio.h>
#include <string.h>

char dstr[10];
char ostr[10];//前八位有效
char ostr2[10];
char dip[40],oip[40],mip[40];
char smallip[40];
char mask[40];
int dot[10];//標記.位置
int byte[10];
int byte2[10];
void d2o(int d){//將十進位制整數轉化為二進位制字串
    int len;
    int i;
    //二進位制字串前8位均設定為0
    for(i=0;i<8;i++)
        ostr[i]='0';
    //十進位制整數轉化為二進位制字串(8位) 5%2=1 5/2=2 2%2=0 2/2=1  1%2=1 1/2=0 101
    i=8;
    ostr[i]='\0';//字串結束標誌
    
    while(d){
        i--;
        ostr[i]=d%2+'0';
        d/=2;
    }
}

int o2d(char *str){//將二進位制八位字串轉化為十進位制整數
    int i;
    int d=0;
    for(i=0;i<8;i++){//將二進位制八位字串轉化為十進位制數
        d*=2;
        d+=str[i]-'0';
    }
    return d;
}

void finddot(char *str){
    int len;
    int i;
    int count=0;
    memset(dot,0,sizeof(dot));
    len=strlen(str);
    for(i=0;i<len;i++){
        if(str[i]=='.')
            dot[count++]=i;
    }
}

void str2byte(char *str){
    int i;
    int len;
    len=strlen(str);
    memset(byte,0,sizeof(byte));
    finddot(str);
    for(i=0;i<dot[0];i++){
        byte[0]*=10;
        byte[0]+=str[i]-'0';
    }
    for(i=dot[0]+1;i<dot[1];i++){
        byte[1]*=10;
        byte[1]+=str[i]-'0';
    }
    for(i=dot[1]+1;i<dot[2];i++){
        byte[2]*=10;
        byte[2]+=str[i]-'0';
    }
    for(i=dot[2]+1;i<len;i++){
        byte[3]*=10;
        byte[3]+=str[i]-'0';
    }
}
int main(){
    int m;
    int i;
    int j;
    int n;
    
    while(scanf("%d",&m)!=EOF){
        strcpy(smallip,"");
        strcpy(mask,"");
        n=32;
        for(i=1;i<=m;i++){
            strcpy(oip,"");
            scanf("%s",dip);
        //將十進位制字串轉十進位制整數
            str2byte(dip);
        //將十進位制整數轉二進位制字串
            for(j=0;j<4;j++){//oip當前32位二進位制IP字串
                d2o(byte[j]);
                strcat(oip,ostr);
            }
            if(i==1){
                strcpy(smallip,oip);
                for(j=0;j<32;j++)
                    mask[j]='1';
                mask[j]='\0';//字串結束標誌
            }else{//確定子網掩碼,即確定mask
                for(j=0;j<n;j++){
                    if(smallip[j]!=oip[j])
                        break;
                }
                if(j<32)
                    mask[j]='0';
                n=j;
            }
        }
    
    //掃描完畢
    //設計子網掩碼
        for(i=0;i<n;i++){
            mask[i]='1';
        }
        for(i=n;i<32;i++){
            mask[i]='0';
        }
        mask[i]='\0';
    
    //根據子網掩碼設計最小IP
        for(i=n;i<32;i++)
            oip[i]='0';
        oip[i]='\0';
    
    
        for(i=0;i<8;i++){//byte[0]資料
            ostr[i]=oip[i];
            ostr2[i]=mask[i];
        }
        ostr[8]='\0';
        byte[0]=o2d(ostr);//最小IP  
    
        ostr2[8]='\0';
        byte2[0]=o2d(ostr2);//子網掩碼
    
        for(i=8;i<16;i++){//byte[1]資料
            ostr[i%8]=oip[i];
            ostr2[i%8]=mask[i];
        }
        ostr[8]='\0';
        byte[1]=o2d(ostr);
    
        ostr2[8]='\0';
        byte2[1]=o2d(ostr2);
    
        for(i=16;i<24;i++){//byte[2]資料
            ostr[i%8]=oip[i];
            ostr2[i%8]=mask[i];
        }
        ostr[8]='\0';
        byte[2]=o2d(ostr);
    
        ostr2[8]='\0';
        byte2[2]=o2d(ostr2);
    
    
        for(i=24;i<32;i++){//byte[3]資料
            ostr[i%8]=oip[i];
            ostr2[i%8]=mask[i];
        }
        ostr[8]='\0';
        byte[3]=o2d(ostr);
    
        ostr2[8]='\0';
        byte2[3]=o2d(ostr2);
    
    //格式化字串
        sprintf(dip,"%d.%d.%d.%d",byte[0],byte[1],byte[2],byte[3]);
        sprintf(mip,"%d.%d.%d.%d",byte2[0],byte2[1],byte2[2],byte2[3]);
        printf("%s\n%s\n",dip,mip);//十進位制
    }
    
    return 0;
}


相關推薦

習題4-5 IP網路 UVa1590

#include <stdio.h> #include <string.h> char dstr[10]; char ostr[10];//前八位有效 char ostr2[10]; char dip[40],oip[40],mip[40]; char smallip[40]; ch

演算法競賽入門經典(第2版)習題4-5 IP網路UVa1590

#include <stdio.h> #include <string.h> int twoip[1005][35]; void changetwo(int num, int i, int j) { int q, chu = num; //printf("%d %d %d\n",

演算法競賽入門經典(第2版)習題4-5 IP網路 IP Networks UVa1590

這道題的邏輯很簡單,讀入所有的ip地址,確認總共32位二進位制數中最左一個不同是在哪裡出現的,然後按規則輸出網路地址與子網掩碼即可。 可上傳後我發現它就是wa...還是wa...總是wa...... 然後我在網上找到了例程,設想出了很多測試資料,用fc拍來拍去,總是報告“找

易學筆記-系統分析師考試-第4章 資料通訊和計算機網路/4.5 網路工程/4.5.3 網路實施

網路實施包括 工程實施計劃 編制網路實施計劃,包括列出各種實施的專案、費用、負責人等 網路裝置到位驗貨 裝置安裝 綜合佈線系統 機房工程 網路裝置 伺服器 系統軟體 應用軟體 系統測試 網路裝置測試 交換機 路由器 防火牆 線

易學筆記-系統分析師考試-第4章 資料通訊和計算機網路/4.5 網路工程/4.5.2 網路設計

網路設計 設計順序:確定網路總體目標和設計原則、設計網路的邏輯結構、設計網路的物理結構 網路設計的任務 確定網路總體目標 採用哪些網路技術和標準 確定網路規模 是否分期實施 網路的實施成本 執行成本等 確定總體設計原則 實用性原則 開放性原則

易學筆記-系統分析師考試-第4章 資料通訊和計算機網路/4.5 網路工程/4.5.1 網路規劃

網路規劃 網路需求分析 總體任務: 調查使用者的網路建設背景、必要性 上網人數和資訊量 確定地理佈局、裝置型別、網路服務、通訊型別、通訊量 形成分析報告 具體需求包括 功能需求:確認使用者希望網路完成的功能、實現成本、總預算等 通訊需求:瞭解使用者需要的

浙大版《資料結構》習題4.5 順序儲存的二叉樹的最近的公共祖先問題 (25 分)

設順序儲存的二叉樹中有編號為i和j的兩個結點,請設計演算法求出它們最近的公共祖先結點的編號和值。 輸入格式: 輸入第1行給出正整數n(≤1000),即順序儲存的最大容量;第2行給出n個非負整數,其間以空格分隔。其中0代表二叉樹中的空結點(如果第1個結點為0,則

習題4-5 換硬幣 (20 point(s)

習題4-5 換硬幣 (20 point(s)) 將一筆零錢換成5分、2分和1分的硬幣,要求每種硬幣至少有一枚,有幾種不同的換法? 輸入格式: 輸入在一行中給出待換的零錢數額x∈(8,100)。 輸出格式: 要求按5分、2分和1分硬幣的數量依次從大到小的順序,輸出各種換法。每行輸出

神經網路案例分析4-5-神經網路遺傳演算法函式極值尋優-基於BP_Adaboost 的強分類器設計

神經網路遺傳演算法函式極值尋優-非線性函式極值尋優 這一章節的演算法是利用神經網路對資料的擬合能力和遺傳演算法的極值尋優能力相結合,求得非線性函式的極值點。既然由神經網路和遺傳演算法相結合的演算法,那

習題4-5 換硬幣(20 分)

將一筆零錢換成5分、2分和1分的硬幣,要求每種硬幣至少有一枚,有幾種不同的換法?輸入格式:輸入在一行中給出待換的零錢數額8。輸出格式:要求按5分、2分和1分硬幣的數量依次從大到小的順序,輸出各種換法。每行輸出一種換法,格式為:“fen5:5分硬幣數量, fen2:2分硬幣數量

習題4 編寫一個方法method(),判斷一個數能否同時被3和5整除

true ati rgs 同時 [] 返回 運算符 pri void 編寫一個方法method(),判斷一個數能否同時被3和5整除 首先編寫一個方法method(),由於是判斷,所以返回的數據類型應是波爾型,並且向主方法傳一個整數類型的參數X public class Z

《TCP/IP網路程式設計》第5章 筆記&程式碼&註釋

在第四章中的回聲迭代客戶端中,客戶端通過write()一次性將字串傳送過去,之後呼叫read()等待接受自己傳輸的字串,因此這個回聲迭代客戶端是不完美的。 解決方法就是提前確定接受資料的大小: //Linux while(1) { //......相同省略 int str_l

《TCP/IP網路程式設計》第4章 筆記&程式碼&註釋

TCP TCP Transmission Control Protocol 傳輸控制協議,意為對資料傳輸過程的控制。 TCP/IP 協議棧 TCP/IP 協議棧分四層: 應用層 TCP層/UDP層 IP層 鏈路層 根據2.的TCP套接字還是UDP套接字

吳恩達神經網路與深度學習——深度神經網路習題4:DNN分類應用

吳恩達神經網路與深度學習——深度神經網路習題4 DNN影象分類應用 將上次實現的DNN應用於貓分類問題 包 import time import numpy as np import h5py import matplotlib.pyplot as plt i

python實現《機器學習》西瓜書習題5.7RBF網路解決異或問題

致敬:https://blog.csdn.net/Snoopy_Yuan/article/details/71024046 RBF首先是確定神經元中心點ci,對於異或,訓練集和驗證集構造0 1取值的二維資料,四個0-1點即為中心點。 然後根據103頁公式計算w和

學習Linux-4.12核心網路協議棧(1.5)——協議棧的初始化(inet_init主要資料結構)

前面瞭解到網路初始化申請了兩塊skb快取記憶體和建立了一個/proc/net/protocols檔案,現在開始重頭戲,網路協議棧的初始化。這篇文章主要介紹網路棧中使用到的主要資料結構。 網路協議棧的核心實現和理論上的分層有些不一樣,在程式碼裡面的分層如下圖: 開始前,

習題 4.9 給一個不多於5位的正整數,要求:1. 求出它是幾位數;2. 分別輸出每一位數字;3. 按逆序輸出各位數字,例如原數為321,應輸出123。

C程式設計 (第四版) 譚浩強 習題4.9 個人設計 習題 4.9 給一個不多於5位的正整數,要求: 1. 求出它是幾位數; 2. 分別輸出每一位數字; 3. 按逆序輸出各位數字,例如原數為321,應輸出123。 程式碼塊:

4.5 Java之網路程式設計

文章目錄 概述 InetAddress 網路通訊協議概述 Socket類 TCP例項一(單向) 客戶端 服務端 修改(新的方法) 執行結果 TCP例項二(雙向)

《TCP IP網路程式設計》尹聖雨----7.第四章習題

(1)請說明TCP/IP的四層協議棧,並說明TCP和UDP套接字經過的層級結構差異。 TCP套接字:鏈路層,IP層,TCP層,應用層 UDP套接字:鏈路層,IP層,UDP層,應用層 (2)請說出TCP/IP協議棧中鏈路層和IP層的作用,並給出二者關係。 鏈路層:是物理連結

習題 8.5 將本章的例8.4改寫為一個多檔案的程式:1.將類定義放在標頭檔案arraymax.h中;2.將成員函式定義放在原始檔arraymax.cpp中;3.主函式放在原始檔file1.cpp中。

C++程式設計(第三版) 譚浩強 習題8.5 個人設計 習題 8.5 將本章的例8.4改寫為一個多檔案的程式: 1.將類定義放在標頭檔案arraymax.h中; 2.將成員函式定義放在