zoukankan      html  css  js  c++  java
  • 2020 HDU校赛 Problem I

    题面

    Problem Description
    在计算机中,对于定点数有三种不同的表示方法。在本题中,假定码的长度固定为8位,从左往右依次编号为第1到8位,第1位为最高位。

    x的原码:最高位为符号位,正数符号位为0,负数符号位为1,第2到7位为x的二进制表示。正负0的原码不同。

    x的反码:原码符号位除外,其他位按位取反,即1变0,0变1。

    x的补码:正数的补码等于原码,负数的补码等于反码+1,因此正负0的补码相同。

    给定整数x,请给出它的原码、反码和补码。

    Input
    第一行包含一个正整数T(1≤T≤300),表示测试数据的组数。

    每组测试数据包含一行,首先是一个符号"+''或"-'',表示x的正负,然后是一个非负整数y(0≤y≤100),表示x的绝对值为y。

    Output
    对于每组数据,输出三行,第一行为原码,第二行为反码,第三行为补码。

    Sample Input
    4
    +0
    +1
    -0
    -3

    Sample Output
    00000000
    01111111
    00000000
    00000001
    01111110
    00000001
    10000000
    11111111
    00000000
    10000011
    11111100
    11111101

    思路

    码制的转换,根据二进制转换成相对于的编码就可以了。

    代码实现(比赛的时候写的,有点乱,将就看)

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<cmath>
    using namespace std;
    int main () {
        int t;
        cin>>t;
        while (t--) {
        int num,temp;
        char zf;
        int s[8];
        cin>>zf;
        cin>>num;
        int ans=num;
        memset (s,0,sizeof (s));
        int its=0;
       while(num!=0)  {
         temp=num%2;
         s[its]=temp;              
         its++;
         num/=2;
    }
       if (zf=='-') cout<<1;
       if (zf=='+') cout<<0;
       if (ans!=0)for(int j=6;j>=0;j--) {           //算出原码
        cout<<s[j];
    }
       else if (ans==0) {
           for (int i=6;i>=0;i--) {
               s[i]=0;
               cout<<s[i];
           }
       }
       cout<<endl;
       int k[8];
       if (zf=='-') cout<<1;
       if (zf=='+') cout<<0;
       for (int j=6;j>=0;j--) {
          if (s[j]==0) k[j]=1;      //反码处理
          else k[j]=0;
          cout<<k[j];
       }
       cout<<endl;
       if (zf=='+') {
          cout<<0;
          for (int i=6;i>=0;i--) cout<<s[i];
          cout<<endl;
       }
       else if (ans==0) cout<<"00000000"<<endl;
       else {
        if (zf=='-') cout<<1;
       if (zf=='+') cout<<0;
       for (int i=0;i<=6;i++) {
           if (k[i]==0) {
               k[i]=1;
               break;
           }
           if (k[i]==1) k[i]=0;
       }
       for (int i=6;i>=0;i--) cout<<k[i];
       cout<<endl;
       
    }
        }
        return 0;
    }
    
  • 相关阅读:
    JSON
    ASP.NET 应用程序与页面生命周期
    authentication vs authorization
    令人郁闷的estimate功能
    Histograms: An Overview
    intro TwoPhase Commit(2PC)
    About transaction lock and V$lock view
    Zenoss Announces Monitoring for VMWare's Cloud Director
    Script to show Active Distributed Transactions
    How to trigger ORA00600,ORA7445 by manual
  • 原文地址:https://www.cnblogs.com/hhlya/p/13170082.html
Copyright © 2011-2022 走看看