1. 程式人生 > >演算法競賽入門經典(第2版)習題4-5 IP網路 IP Networks UVa1590

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

這道題的邏輯很簡單,讀入所有的ip地址,確認總共32位二進位制數中最左一個不同是在哪裡出現的,然後按規則輸出網路地址與子網掩碼即可。

可上傳後我發現它就是wa...還是wa...總是wa......

然後我在網上找到了例程,設想出了很多測試資料,用fc拍來拍去,總是報告“找不到差異”。

我覺得可能是測試資料想得不周全,看到書上註明這個是NEERC 2005的比賽題,於是我找到了這場比賽的官方測試資料

但fc還是“找不到差異”......

最後我決定往輸出的最末尾新增一個“\n",然後就ac了。這和習題4-3正好相反。

原來如果A文字末尾只有一個"\n”而B文字沒有“\n"的話,fc會無視這種差異,但UVa在乎。

習題4-3與習題4-5你們兩個“磨人的小妖精”......

//#define LOCAL
//#define TESTING
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<iostream>
#include<cstdio>
#define MAXN 1005

int sec[MAXN][5],mask[5],ip[5];
char sec2[MAXN][40], mask2[40], ip2[40];

void save(char* s, int n, int ind)
{
    int se = 0, temp = 0;
    for(int i = 0; i <= n; i++)
    {
        if(isdigit(s[i])) temp = temp * 10 +s[i]-'0';
        else
        {
            sec[ind][se] = temp;
            se++;
            temp = 0;
        }
    }
    for(int i = 3; i >= 0; i--)
    {
        int temp2;
        
        temp2 = sec[ind][i];
        for(int j = 0; j < 8; j++)
        {
            sec2[ind][24-i*8+j] = temp2 % 2+'0';
            temp2 /= 2;
        }
    }
    #ifdef TESTING
    printf("sec[%d]= %d.%d.%d.%d = %s\n", ind, sec[ind][0], sec[ind][1], sec[ind][2], sec[ind][3], sec2[ind]);
    #endif
}

void getip(int ind)
{
    memset(ip,0,sizeof(ip));
    memset(ip2,0,sizeof(ip2));
    for(int i = 0; i < 32; i++)
    {
        if(i<ind) ip2[i] = '0';
        else ip2[i] = sec2[1][i];
    }
    #ifdef TESTING
    printf("ip2=%s\n", ip2);
    #endif
    for(int i = 0; i < 4; i++)
    {
        int n = 1;
        for(int j = 0; j < 8; j++)
        {
            ip[3-i] += (ip2[j+8*i]-'0')*n;
            n*=2;
        }
    }
}

void getmask(int ind)
{
    memset(mask,0,sizeof(mask));
    memset(mask2,0,sizeof(mask2));
    for(int i = 0; i < 32; i++)
    {
        if(i<ind) mask2[i] = '0';
        else mask2[i] = '1';
    }
    #ifdef TESTING
    printf("mask2=");
    for(int i = 0; i<32; i++) printf("%c", mask2[i]);
    printf("\n");
    //printf("mask2=%s\n",mask2);
    #endif
    for(int i = 0; i < 4; i++)
    {
        int n = 1;
        for(int j = 0; j < 8; j++)
        {
            mask[3-i] += (mask2[j+8*i]-'0')*n;
            n*=2;
        }
    }
}
using namespace std;
int main()
{
    #ifdef LOCAL
    freopen("xt4-5.in", "r", stdin);
    freopen("xt4-5.out", "w", stdout);
    #endif
    memset(sec,0,sizeof(sec));
    int N;
    bool first = true;
    //while(cin>>N)
    while(scanf("%d", &N)!=EOF)
    {
        for(int i = 1; i <= N; i++)
        {
            char temps[MAXN];
            scanf("%s", temps);
            #ifdef TESTING
            printf("n=%d %s\n", strlen(temps), temps);
            #endif
            save(temps,strlen(temps),i);
        }
        int byte = 0;
        for(int i = 2; i <=N; i++)
        {
            for(int j = 31; j >= byte; j--)
            {
                if(sec2[i][j]!=sec2[1][j])
                {
                    byte = j+1;
                    break;
                }
            }
        }
        getip(byte);
        getmask(byte);
        #ifdef TESTING
        printf("%d\n", byte);
        #endif
        if(!first) printf("\n");
        for(int i = 0; i < 4; i++)
        {
            if(i) printf(".");
            printf("%d", ip[i]);
        }
        printf("\n");
        for(int i = 0; i < 4; i++)
        {
            if(i) printf(".");
            printf("%d", mask[i]);
        }
        first = false;
    }
    printf("\n");//能不能ac就靠這句了
    return 0;
}


相關推薦

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

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

演算法競賽入門經典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-3 黑白棋 Othello UVa220

這題邏輯和習題4-1象棋很相似,沒什麼特別的。 第一次提交報wa,添加了若干樣例測試,發現邏輯無誤。 與樣例輸出對拍後發現輸出尾部多了一個換行符,修改後ac。 //#define LOCAL //#define TESTING #include<stdio.h>

演算法競賽入門經典2習題3-5 謎題Puzzle) Uva227

C++編寫 #include<iostream> using namespace std; int main() { int x = 2, y = 1; char Pu

UVa220 演算法競賽入門經典2習題4-3 黑白棋 Othello

 老規則   題目解釋看他們的  程式碼看我的。。         可能我的程式碼略微濃縮一些。  。。 。。我找了半天,,程式碼寫的都好長。,要是看懂了題目的話 就看我的程式碼吧。 http://blog.csdn.net/kyoma/article/details/51

演算法競賽入門經典2習題3-4 週期串 Periodic Strings UVa445

這題把我虐哭了。 提交了13次才ac。 演算法本身沒什麼好說的,UVa上html版和pdf版的輸入輸出格式要求不一樣,以html版為準。 而且html版的輸入輸出格式都有點奇葩,不認真看原文細節是ac不了的。 參考了他的例程,我才找到問題的解決辦法。 UVa評測系統中的空

演算法競賽入門經典2紫書

紫書 第3章陣列和字串(例題) 例題3-1 TEX Quotes 例題3-2 WERTYU 例題3-3 Palindromes 例題3-4 Master-Mind Hints 例題3-5 Digit Generator 例題3-6 Circular Sequence 紫書

演算法競賽入門經典2救濟金髮放The Dole Queue,UVa133

演算法競賽入門經典(第2版)救濟金髮放(The Dole Queue,UVa133 import java.util.Scanner; /** * @author Joker */ publ

tcp/ip入門經典2 十五章 監控和遠端訪問

1.本章內容 telnet berkeley r*工具 ssh 遠端控制 網路管理 snmp rmon 2.網路可以說是為了共享遠端的資源而建立的,所以在網路上做的幾乎所有的事情都可以歸結為遠端訪問。 3.telnet telnet是對遠端計算機進

JavaScript入門經典讀書筆記

utc 文件名 ttext 文檔 開頭 rep 顯示 部分 body 第一部分 Web腳本編寫與JavaScript語言的概念 1.document.lastModified() -> 返回文檔修改日期 2.<head>標簽中的<sc

C語言入門經典.pdf

《C語言入門經典(第4版)》的目標是使你在C語言程式設計方面由一位初學者成為一位稱職的程式設計師。讀者基本不需要具備任何程式設計知識,即可通過《C語言入門經典(第4版)》從頭開始編寫自己的C程式。研讀《C語言入門經典(第4版)》,你就可以成為一位稱職的C語言程式設計師。從許多方面來說,C語言

《C#入門經典6》學習筆記_10章_定義類成員

第10章 定義類成員 本章內容:  如何定義類成員  如何使用類圖新增成員  如何控制類成員的繼承  如何定義巢狀的類  如何實現介面  如何使用部分類定義  如何使用Call Hierarchy視窗 10.1 成員定義 在類定義中,也提供了該類中

《C#入門經典6》學習筆記_6章_函式

第103頁-第128頁,共26頁。 本章內容: 如何定義和使用不接受任何資料也不返回任何資料的簡單函式 如何在函式中傳入傳出資料 使用變數作用域 如何結合使用Main()函式和命令列引數 如何把函式提供為結構型別的成員 如何使用函式過載 如何使用委託 本章介

《Redis入門指南2》摘要

緣起 想找一個開源技術點深入下去的,於是找到了redis,比較好的是,他有相應的學習曲線。 全書第1遍用了3h19min的樣子,20181117開始讀的,20181123讀完。還會繼續閱讀第2遍或第3遍,雖然原理性可能不太多,但我還沒有很好的消化它,雖然這本書不是

JavaScript入門經典7讀書筆記

斷斷續續看了十來天,終於看完了,還是學到些東西,這本書還是不錯的,各方面都有涉及。 補充了下之前不完善的JS 知識 筆記一般只記必要的東西。‎ Table of Contents 1. JavaScript 基礎 1.1. JavaScript 簡介

演算法競賽入門經典第二三章陣列和字串習題3-2分子量

給出一種物質的分子式不帶括號,求分子量。本題中的分子式只包含4種原子分別為CHON,原子量分別為12.01,1.008,16.00,14.01(單位g/mol)。例如,C6H5OH的分子量是94.108g/mol #include <stdio.h> int main() {

演算法競賽入門經典2第二章習題

本文部分習題參考了litiouslove的blog: http://blog.csdn.net/litiouslove/article/details/7891700 習題2-1 水仙花數(daffodil) 輸出100~999中的所有水仙花數。若3位數ABC滿足ABC=A3+B3+

演算法競賽入門經典2第一章 部分實驗題

1.5.2資料型別實驗 實驗A1:表示式11111*11111的值是多少?把5個1改成6個1呢?9個1呢? 實驗A2:把實驗A1中的所有數換成浮點數,結果如何? 實驗A3:表示式sqrt(-10)的值是多少?嘗試用各種方式輸出。在計算的過程中系統會報錯嗎? 實驗A4:表示式1.0/

演算法競賽入門經典第二三章陣列和字串習題3-4週期串

如果一個字串可以由某個長度為k的字串重複多次得到,則稱該串以k為週期。例如abcabcabc以3為週期(注意,它也以6和12為週期)。輸入一個長度不超過80的字串,輸出其最小週期 #include<stdio.h> int main() { char a[100];

演算法競賽入門經典第二三章陣列和字串習題3-3數數字

把前n(n<=10000)個整數順次解除安裝一起:123456789101112…數一數0~9各出現多少次(輸出10個整數,分別是0,1,…,9出現的次數) #include<stdio.h> #define N 100000 char s[N],temp[10]; i