新普金娱乐网址


程序员如何转型也颇数额工程师?

地理罗胖的跨年演讲,不仅能爆棚,而且那个藏套路

PAT 1049. 屡排的片及

  • 九月 23, 2018
  • 数学
  • 没有评论

输入格式:

HashHelper

脚一个C#本的家伙类,主要职能是计量文件Hash,文件MD5,文件之CRC32

using System;
using System.IO;
using System.Text;

/// <summary>
/// 提供用于计算指定文件哈希值的方法
/// <example>例如计算文件的MD5值:
/// <code>
///   String hashMd5=HashHelper.GetMD5("MyFile.txt");
/// </code>
/// </example>
/// <example>例如计算文件的CRC32值:
/// <code>
///   String hashCrc32 = HashHelper.GetCRC32("MyFile.txt");
/// </code>
/// </example>
/// <example>例如计算文件的SHA1值:
/// <code>
///   String hashSha1 =HashHelper.GetSHA1("MyFile.txt");
/// </code>
/// </example>
/// </summary>
public class HashHelper
{
    /// <summary>
    ///  计算指定文件的MD5值
    /// </summary>
    /// <param name="fileName">指定文件的完全限定名称</param>
    /// <returns>返回值的字符串形式</returns>
    public static String GetMD5(String fileName)
    {
        String hashMD5 = String.Empty;
        //检查文件是否存在,如果文件存在则进行计算,否则返回空值
        if (File.Exists(fileName))
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                //计算文件的MD5值
                System.Security.Cryptography.MD5 calculator = System.Security.Cryptography.MD5.Create();
                Byte[] buffer = calculator.ComputeHash(fs);
                calculator.Clear();
                //将字节数组转换成十六进制的字符串形式
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < buffer.Length; i++)
                {
                    stringBuilder.Append(buffer[i].ToString("x2"));
                }
                hashMD5 = stringBuilder.ToString();
            }//关闭文件流
        }//结束计算
        return hashMD5;
    }//ComputeMD5

    /// <summary>
    ///  计算指定文件的CRC32值
    /// </summary>
    /// <param name="fileName">指定文件的完全限定名称</param>
    /// <returns>返回值的字符串形式</returns>
    public static String GetCRC32(String fileName)
    {
        String hashCRC32 = String.Empty;
        //检查文件是否存在,如果文件存在则进行计算,否则返回空值
        if (File.Exists(fileName))
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                //计算文件的CSC32值
                Crc32 calculator = new Crc32();
                Byte[] buffer = calculator.ComputeHash(fs);
                calculator.Clear();
                //将字节数组转换成十六进制的字符串形式
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < buffer.Length; i++)
                {
                    stringBuilder.Append(buffer[i].ToString("x2"));
                }
                hashCRC32 = stringBuilder.ToString();
            }//关闭文件流
        }
        return hashCRC32;
    }//ComputeCRC32


    /// <summary>
    /// 获取文件的SHA1
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static String GetSHA1(String fileName)
    {
        String hashSHA1 = String.Empty;
        //检查文件是否存在,如果文件存在则进行计算,否则返回空值
        if (File.Exists(fileName))
        {
            using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                //计算文件的SHA1值
                System.Security.Cryptography.SHA1 calculator = System.Security.Cryptography.SHA1.Create();
                Byte[] buffer = calculator.ComputeHash(fileStream);
                calculator.Clear();
                //将字节数组转换成十六进制的字符串形式
                StringBuilder stringBuilder = new StringBuilder();
                for (int bufferIdx = 0; bufferIdx < buffer.Length; bufferIdx++)
                {
                    stringBuilder.Append(buffer[bufferIdx].ToString("x2"));
                }
                hashSHA1 = stringBuilder.ToString();

            }//关闭文件流
        }
        else
        {
            Console.Error.WriteLine("{0}文件找不到!", fileName);
        }
        return hashSHA1;
    }//end GetSHA1
}

/// <summary>
/// 提供 CRC32 算法的实现
/// </summary>
public class Crc32 : System.Security.Cryptography.HashAlgorithm
{
    public const UInt32 DefaultPolynomial = 0xedb88320;
    public const UInt32 DefaultSeed = 0xffffffff;
    private UInt32 hash;
    private UInt32 seed;
    private UInt32[] table;
    private static UInt32[] defaultTable;
    public Crc32()
    {
        table = InitializeTable(DefaultPolynomial);
        seed = DefaultSeed;
        Initialize();
    }
    public Crc32(UInt32 polynomial, UInt32 seed)
    {
        table = InitializeTable(polynomial);
        this.seed = seed;
        Initialize();
    }
    public override void Initialize()
    {
        hash = seed;
    }
    protected override void HashCore(byte[] buffer, int start, int length)
    {
        hash = CalculateHash(table, hash, buffer, start, length);
    }
    protected override byte[] HashFinal()
    {
        byte[] hashBuffer = UInt32ToBigEndianBytes(~hash);
        this.HashValue = hashBuffer;
        return hashBuffer;
    }
    public static UInt32 Compute(byte[] buffer)
    {
        return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length);
    }
    public static UInt32 Compute(UInt32 seed, byte[] buffer)
    {
        return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length);
    }
    public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer)
    {
        return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length);
    }
    private static UInt32[] InitializeTable(UInt32 polynomial)
    {
        if (polynomial == DefaultPolynomial && defaultTable != null)
        {
            return defaultTable;
        }
        UInt32[] createTable = new UInt32[256];
        for (int i = 0; i < 256; i++)
        {
            UInt32 entry = (UInt32)i;
            for (int j = 0; j < 8; j++)
            {
                if ((entry & 1) == 1)
                    entry = (entry >> 1) ^ polynomial;
                else
                    entry = entry >> 1;
            }
            createTable[i] = entry;
        }
        if (polynomial == DefaultPolynomial)
        {
            defaultTable = createTable;
        }
        return createTable;
    }
    private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size)
    {
        UInt32 crc = seed;
        for (int i = start; i < size; i++)
        {
            unchecked
            {
                crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff];
            }
        }
        return crc;
    }
    private byte[] UInt32ToBigEndianBytes(UInt32 x)
    {
        return new byte[] { (byte)((x >> 24) & 0xff), (byte)((x >> 16) & 0xff), (byte)((x >> 8) & 0xff), (byte)(x & 0xff) };
    }
}//end class: Crc32

代码

#include<iostream>
using namespace std;
int main(){
    int N; cin>>N;
    double a[100001],sum=0.0;
    for(int i=1;i<=N;i++){
    cin>>a[i];
    sum+=a[i]*(N-i+1)*i;    // 注意一定要把a[i]和i 或者(N-i+1)先乘,不然通过不了,估计可能是会损失精确度
    }
    printf("%.2f", sum);
    return 0;
}

正文旨在广泛安全系的学识,并靠一个C#心想事成的文件管理工具。

输入样例:

CRC

循环冗余校验(英语:Cyclic redundancy
check
,通称“CRC”)是一模一样栽根据网数据包或处理器文件当数码发生简短固定位数校验码的均等栽散列函數,主要为此来检测或者校验数据传或者封存后也许出现的错。生成的数字以传或者存储之前计算出来并且附加到数背后,然后接收方进行查确定数据是否发生变化。一般的话,循环冗余校验的价值都是32员的整数。由于本函数易于用二进制的电脑硬件下、容易开展数学分析并且愈来愈擅长检测传输通道干扰引起的错误,因此获得广泛应用。此方是由于W.
Wesley
Peterson于1961年发表

 

  • 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

Hash

平安散列算法(英语:Secure Hash
Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所验证的五栽安全散列算法。能算计产生一个数字信息所对诺交之,长度固定的字符串(又如消息摘要)的算法。且若输入的音讯不同,它们对准承诺到不同字符串的概率很高。这些算法之所以称为“安全”是冲以下简单碰(根据官方正式的叙述):

HASH是冲文件的内容的数量通过逻辑运算得到的数值,
不同之文书(即使是平等的文本称)得到的HASH值是见仁见智之,
所以HASH值就改为了各级一个文件之身份证。

今非昔比HASH值的公文内容为是不相同之,相同之HASH值的文书之情自然是完全相同(即使文件名不同).

HASH值还有文件校验的效能,相当给文件之校验码.
所以还可以就此来检查文件下载是否正确(比如我们于下载系统镜像或另开源软件时,官网还见面供文件之HASH值,让我们通过对比HASH值来判定文件是否让改动了)。

文本之Hash值在下载文件之校验方面来深十分的用处,Hash值是文本内容之经过二进制码进行相同多样的变换生成出来的,即使文件称发生变化,Hash的价为无见面有变更。因此当付出之进程遭到貌似比少单文件是否同样都是去比较单薄独公文的Hash值。

 

出口样例:

MD5

英文全称Message-Digest Algorithm(信息摘要算法)

每当下载一下物时,经常以部分回落包属性里,看到md5价值。而且这下载页面,很可能会见当某某一个地方,写了扳平句,此文件的MD5值为XXXXXXXXX。这生啊作用吗?

空话白话:md5,其实就是是一中算法。可以用一个字符串,或文件,或压缩包,执行md5后,就足以十分成一个永恒长度为128bit底差。这个串,基本上是绝无仅有的。

因而,有人修了压缩包后,就会见转变新的差,这时就好拿网站提供的失误和新生成的错对比,如果差,那即便是让人编写了了了。

再度多要查看:https://zh.wikipedia.org/wiki/MD5 /
http://www.weixuehao.com/archives/474

 

出口格式:

PAT 1049. 频列的一对和

分析

经过数学知识可以推进演出每个坐席的高频起的次数

输入第一实行被起一个免超越105底正整数N,表示数列中数的个数,第二履行吃出N个不超1.0底正数,是数列中的反复,其间因为空格分隔。

让得一个正数数排列,我们可以从中截取任意的连接的几只数,称为片段。例如,给定数列{0.1,
0.2, 0.3, 0.4},我们发(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3,
0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4)
这10个部分。

5.00
4
0.1 0.2 0.3 0.4

每当一行中输出该队所有片包含的高频之与,精确到稍微数点后2各。

深受定正整数数列,求出全组成部分包含的所有的累累的同。如本例中10只有总和是0.1

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图