大数相加—位运算

本文整理了C语言中大数据的相加算法,基于位运算来实现。亲测可用。

//100位大数相加

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

#define Max 101//有进位101  

int bigNumAdd(char a[],char b[],char sum[])
{
    int i=0;
    int c=0;//表示进位  

    //清0
    char m[Max]={0};
    char n[Max]={0};
    memset(sum,0,101);  

    //字符串反转且字符串变数字
    int lenA=strlen(a);
    int lenB=strlen(b);

    int result_len = (lenA > lenB)?lenA:lenB;  

    for (i=0;i<lenA;i++)
    {
       m[i]=a[lenA-i-1]-'0';
    }
    for (i=0;i<lenB;i++)
    {
       n[i]=b[lenB-i-1]-'0';
    }  

    //位运算:如果最后一位进位len+1
    for (i=0;i<result_len;i++)
    {
       sum[i]=(m[i]+n[i]+c)%10+'0';//得到末位
       c=(m[i]+n[i]+c)/10;//得到进位
    }  

    //最后一次有进位,要把进位后的那一位赋值为1,并且sum总长度加1
    if (c)
    {
	sum[result_len]=c+'0';
	result_len++;
    }  

    return result_len;
}   

void print(char sum[],int result_len)
{
    int i;   

    for(i=result_len-1; i>=0; i--)
    {
        printf("%c",sum[i]);
    }
    puts("\n");
} 

int main()
{
    char a[Max];
    char b[Max];
    char sum[Max];
    puts("input a:");
    gets(a);
    puts("input b:");
    gets(b);
    print(sum,bigNumAdd(a,b,sum));
    return 0;
}

上述代码只适用正数的大数相加,相减或者负数等原理一样,大家自己整理学习下。

测试一组数据如下:

时间: 2024-11-04 19:23:35

大数相加—位运算的相关文章

高精度问题之大数相加(原来就是用字符串相加,模拟手算这么简单!)

解题心的: 就是基本的一对一模拟手算..借助c++的string 不用逆序运算了.很方便的补0.  最后处理下前导0的问题. #include <iostream> #include <string> using namespace std; // 实现大数相加 结果存放在num中 void bigIntergerAdd(string &num, string add) { int goBit = 0; // 存放进位 // 先交换下顺序 加数的位数要比较少 if (num

大数相加(类似杭电acm1002)

/*输入两个非常大的整数(完全超出了int.long的表示范围),这个整数的长度可能超过100位,计算并输出这两个数相加的结果.*/ //自己用题目所给的案例测试,输出是正确的,也能输出正确的结果,不知道为什么提交以后一直wa,(如果有人测试了我代码以后知道我wa的原因请评论中提出哦,十分感谢),但是算法思想应该是对的,也参考了其他人的博客,(http://blog.csdn.net/hackbuteer1/article/details/6667026的大数相加的题目) 我的代码如下: //大

位运算总结&amp;拾遗

JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个数为2的幂,那么该数的二进制码只有最高位是1. 根据这个性质,我们来举个栗子,比如有数字10,转为二进制码后为: 1 0 1 0 我们只需把 0 bit的位置全部用1填充,然后再把该二进制码加1就ok了.而x | (x + 1)正好可以把最右边的0置为1,可是

137.Single Number II(法1排序法2STL容器map哈希法3位运算法4改进的位运算)

Given an array of integers, every element appears three timesexcept for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement itwithout using extra memory? HideTags Bit Manipulation #pragma once

进制、位运算笔记

进制 位运算 进制介绍 一种计数的方式,数值的表示形式. 常见的进制有:二进制.十进制.八进制和十六进制. 二进制: 0和1,C语言中表示0b开头或者0B开头. 八进制: 0,1,2,3,4,5,6,7 C语言中以0开头的数字,例如045 十进制: 自然数 十六进制: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F C语言中以0x或者0X开头的数字 进制之间的转换: 其他进制转换成十进制的三要素: 1. 数位:数码在一个数中所处的位置. 一个序列,从右往左数位依次是0,1,2,3

位运算之——按位与(&amp;)操作——(快速取模算法)

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a.b中对应位同时为1,则对应结果位也为1. 例如: 10010001101000101011001111000 & 111111100000000 --------------------------------------------- 10101100000000 对10101100000000进行右移8位得到的是101011,这就得

[模拟]位运算实现加减法

1 /* 2 * 单位加:找与+对应的位运算,分析真值表得出是按位异或^ 3 * 进位:可以用<<进行,但是要判断是否存在进位操作,则需要&来判断. 4 * 加的操作执行到不进位为止,代码如下: 5 * 6 */ 7 LL quickadd(int x, int y) { 8 int xr = x ^ y; //加 9 int nd = x & y; //统计进位 10 while(nd) { 11 int xr1 = xr; 12 int nd1 = nd <<

神奇的位运算

写这篇文章的主要目的就是一个不断积累的过程, 文中提到的方法其实平时很少用到,就当做是知识扩展吧 位运算中常见的一个操作 与& , 或| , 非~  异或 ^    左移位<<  又移位>> 定义我就不说了,记录几个用法直接上代码了 1,求两个数的平均值(有效防止溢出的位运算方法) int ave(int a,int b) { reutrn (a&b) + ((a^b)>>1) } 解释下,(a&b)表示a,b二进制中都为1的部分(既然是公共的部

位运算 使用技巧

位运算简介及实用技巧(一):基础篇 什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算.举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理): 110 AND 1011 ---------- 0010  -->  2 由于位运算