设为首页 加入收藏

TOP

二进制数的高精度运算(一)
2023-07-23 13:30:41 】 浏览:164
Tags:高精度

        我们知道,一个int型整数一般用32位二进制数存储,所表示的最大整数值为 231-1,对应1个10位的十进制整数。因此,一个更大的整数可能需要更多的二进制位来存储,在处理时需要对其进行高精度运算处理。

【例1】二进制加法

问题描述

二进制数相加与十进制数的长加非常相似。与十进制数字一样,从右到左,一次一列地进行各位对应数字的相加。与十进制加法不同,二进制位加法的进位规则是逢二进一

0 + 0 = 0

1 + 0 = 1

0 + 1 = 1

1 + 1 = 10

1 + 1 + 1 = 11

输入

第一行输入是整数N(1≤ N≤ 1000),表示测试用例的组数。之后N行,每行是一组测试用例,其中包含两个由单个空格字符分隔的二进制值。每个二进制值的最大长度为80位(二进制数字)。注:最大长度结果可能是81位(二进制数字)。

输出

对于每组测试用例,在一行中输出测试用例编号、空格和加法的二进制结果。必须省略额外的前导零。

输入样例

3

1001101 10010

1001001 11001

1000111 1010110

输出样例 

1 1011111

2 1100010

3 10011101

       (1)编程思路。

       将二进制数用字符串保存,编写函数void binAdd(char *a,char *b,char *c),完成二进制数C=A+B这一功能。在函数中,先将字符串表示的二进制数A和B分别转换到整型数组X和Y中,转换时注意二进制字符串的最低位(如a[0])对应到数组X的最高位(如x[strlen(a)-1]),二进制字符串的最高位(如a[strlen(a)-1])对应到数组X的最低位(如x[0])。然后将数组X和Y从下标0开始(也是二进制数的个位),逐位对应相加,逢二进一。

       (2)源程序。

#include <stdio.h>
#include <string.h>
void binAdd(char *a,char *b,char *c)
{
    int len1=strlen(a),len2=strlen(b);
    int x[91],y[91],z[91];
    int len=len1>len2?len1:len2;
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    memset(z,0,sizeof(z));
    int i;
    for (i=len1-1;i>=0;i--)
        x[len1-1-i]=a[i]-'0';
    for (i=len2-1;i>=0;i--)
        y[len2-1-i]=b[i]-'0';
    int cf=0;
    for (i=0;i<len;i++)
    {
        z[i]=(x[i]+y[i]+cf)%2;
        cf=(x[i]+y[i]+cf)/2;
    }
    z[len++]=cf;
    while (len>=0 && z[len-1]==0)  // 去前置0
        len--;
    if (len==0)                    // a+b=0时特判
    {
        c[0]='0';
        c[1]='\0';
        return ;
    }
    for (i=0;i<len;i++)
        c[i]=z[len-1-i]+'0';
    c[len]='\0';
}
int main()
{
    char s1[91],s2[91],ans[91];
    int n,i;
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%s%s",s1,s2);
        binAdd(s1,s2,ans);
        printf("%d %s\n",i,ans);
    }
    return 0;
}

       将上面的源程序提交给 北大POJ题库 POJ 2845  01000001(http://poj.org/problem?id=2845),可以Accepted。

【例2】最大公约数

问题描述

 给出两个二进制数A和B,求它们的最大公约数。

输入

输入的第一行是T(1≤ T≤ 100),代表需要解决的测试用例数。

之后T行,每行包含两个二进制数A和B。(0< A,B ≤ 21000)

输出

对于每个测试用例,输出A和B的最大公约数,这个最大公约数也以二进制数显示。

输入样例

3

10 100

100 110

10010 1100

输出样例 

Case #1: 10

Case #2: 10

Case #3: 110

        (1)编程思路。

         设gcd(a,b) 表示求两个二进制数的最大公约数。有

         (1)若a,b都为偶数, 则 gcd(a,b) = 2*gcd(a/2,b/2)。

         (2)若 a为偶数,b为奇数,则 gcd(a,b) = gcd(a/2,b)。

         (3)若 a,b 都为奇数(设a大于等于b),则 gcd(a,b) = gcd((a-b),b)。

         按照这种思路直接求两个二进制数的最大公约数就比较简单了。主要涉及二进制的相减运算(a-b),相减时总是大数减小数(即a>b);二进制数除以2,这个操作比较简单,直接去掉个位数即可,也就是删除bit数组中的bit[0]元素,同时len减1。

       定义结构体类型

       struct BigNumber

       {

           int len;        //  保存二进制数的位数

           int bit[1005];  //  保存各位的数字,每个数组元素保存二进制数的1位数,其中bit[0]保存二进制数的个位数。

       };  的变量来保存二进制数。

       同时定义4个函数,分别实现两个二进制数的大小比较、两个二进制数相减、一个二进制数除以2、求两个二进制数的最大公约数等功能。

        (2)源程序。

#include <stdio.h>
#include <string.h>
struct BigNumber
{
   int len;
   int bit[1005];
};
int compare(struct BigN
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Windows OpenGL ES 图像色阶 下一篇OpenGL ES 名词解释(二)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目