C语言超大数相加求和、加减乘除算法实现

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

#define MAXLEN 20
int arr1[MAXLEN];
int arr2[MAXLEN];
char str1[MAXLEN];
char str2[MAXLEN];

void convertBin(int intNum) {

   static int bitSize = 32;
   int modBin = intNum & 1;
   int modNum = intNum >> 1;
   
   if(bitSize --)
      convertBin(modNum);
   printf("%d",modBin);
}

int add(int a,int b) {
   return b ? add(a^b,(a&b)<<1) : a;
}

int complementNum(int b) {

   return add(~b,1);
}
int Min(int a, int b) {
   return add(a,complementNum(b));
}

int Mul(int a,int b) {
   
   int sum = 0;
   int isNeg = ( a > 0) ^ ( b > 0);
   unsigned int num = ( a > 0) ? a : complementNum(a);
   unsigned int numAdd = ( b > 0 ) ? b : complementNum(b);

   while(numAdd) {
      if(numAdd & 1)
         sum = add(num,sum);
      numAdd = numAdd >> 1;
      num = num << 1;
   }
   return isNeg ? complementNum(sum) : sum;
}

int Pow(int a, int b) {

   int sum = 1, q = a;
   while(b) {
      if(b & 1)
         sum = Mul(sum,q);
      b >>= 1;
      q = Mul(q,q);
   }
   return sum;
}

int division(int a, int b) {

   int num = 0;
   int isNeg = ( a > 0) ^ ( b > 0);
   unsigned int num1 = a > 0 ? a : complementNum(a);
   unsigned int num2 = b > 0 ? b : complementNum(b);
   while(num1) {
      if( num1 >= num2) {
         num1 = Min(num1,num2);
         num = add(1,num);
      } else
         break;
   }
   
   return isNeg ? complementNum(num) : num;
}

int Mod(int a,int b){
   int isNeg = ( a > 0) ^ ( b > 0);
   unsigned int num1 = a > 0 ? a : complementNum(a);
   unsigned int num2 = b > 0 ? b : complementNum(b);
   int modNum;
   while(num1) {
      modNum = num1;
      if(num1 >= num2) {
         num1 = Min(num1,num2);
      } else {
         break;
      }
   }
   return isNeg ? complementNum(modNum) : modNum;
}

int main(void) {

   //大数求和有待封装
   printf("Please Input Str1:\n");
   scanf("%s",&str1);
   printf("Please Input Str2:\n");
   scanf("%s",&str2);

   int strLen1 = strlen(str1);
   int strLen2 = strlen(str2);

   int i,k;
   int j = 0, l = 0;
   for(i = strLen1 - 1; i>=0;i--) {
      arr1[j++] = str1[i] - ‘0‘;
   }

   for(k = strLen2 - 1; k>=0;k--) {
      arr2[l++] = str2[k] - ‘0‘;
   }

   for(i=0;i<MAXLEN;i++) {
      arr1[i] += arr2[i];
      if(arr1[i] >= 10) {
         arr1[i] -= 10;
         arr1[i+1] ++;
      }
   }

   _Bool skipFlag = false;
   for(i=MAXLEN -1;i>=0;i--) {
      if(skipFlag) {
         printf("%d",arr1[i]);
      } else if(arr1[i]) {
         printf("%d",arr1[i]);
         skipFlag = true;
      }
   }

   if(!skipFlag)
      printf("0");
   
   return 0;
   int intNum,addNum,minNum,num1,num2;
   printf("Please Input an Integer:\n");
   scanf("%d",&num1);
   printf("Please Input another Integer:\n");
   scanf("%d",&num2);
   printf("%d / %d = %d\n",num1, num2, division(num1,num2));
   printf("%d 求余 %d = %d\n",num1, num2, Mod(num1,num2));
   //printf("%d ^ %d = %d\n",num1,num2,Pow(num1,num2));
   //addNum = add(num1,num2);
   //minNum = Min(num1,num2);
   //printf("%d + %d = %d\n",num1, num2, addNum);
   //printf("%d - %d = %d\n",num1, num2, minNum);
   //scanf("%d",&intNum);
   //printf("%d & 1 = %d  %d & 0x01 = %d",num1,num1&1,num1,num1&0x01);
   //printf("%d\n",intNum >>=1);
   //convertBin(intNum);
   //printf("\n");
   return 0;
}
时间: 2024-11-08 22:00:09

C语言超大数相加求和、加减乘除算法实现的相关文章

两个超大数相加

解决超大数相加的问题的一种思路是把整形转化成字符串,废话不多说直接上代码,已经调试通过. #include<iostream> #include<string> #include<cmath> using namespace std; string add(string str1, string str2) { int i; string str; int len_str1 = str1.length(); int len_str2 = str2.length(); i

任意数相加求和

在网上看到一端代码,觉得很新颖,特此记录下来以供大家学习参考: 用C#写一个函数.功能如下: 任意给定一组数,例如{12,60,-8,99,15,35,17,18},找出任意数相加(不能重复)之后的结果为35(任意设定)的情况 例如:12+8+15; 35; 17+18. 算法如下: private static readonly int[] values = {12,60,8,99,15,35,17,18 };     private const int toltal = 35; privat

Java-整数相加求和

一.设计思想 1.创建工程Sum,在包Add下添加类Sum,功能是整数相加求和. 2.输入多个整数. 3.将输入的字符串转化为数字,用import语句导入包java.util,再调用类Scanner 4.对sum初始化,对多个整数进行累加求和. 5.输出多个整数的求和结果. 二.流程图 三.源代码 package Add; import java.util.Scanner; public class Sum { public static void main(String[] args) { S

超大数相加C语言程序设计

#include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) {          char one[100],two[100],sum[100];          int temp=0,lenth,lenthTwo,i,lenthOfSum;          scanf("%s",one);     getchar();//读取回车字符     scanf(&q

C语言超大数据相加计算整理

在做ACM 1002题时,整理得到. #include<stdio.h>#include<string.h>#define MAX 1000void zero(char *s,int len){ int i; for(i=0;i<len;i++) s[i]-='0';}void back(char *s,int len){ int i; for(i=0;i<len;i++) s[i]+='0';}int main(){ char a[20][MAX],b[20][MAX

使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码

正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.unsigend long.unsigend long long等等,都有固定的存储空间,而哪怕是64位系统下的变量unsigend long long,能存储的最大范围只有1844674407370955161. 下边复习一下基础类型的存储范围以及所占字节: 编程语言的基础类型速查表 char -1

Leetcode算法系列(链表)之两数相加

Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和.您可以假设除了数字 0 之外,这两个数都不会以 0 开头.示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807 链接:https://le

可以连续几行数,,,分别相加求和

Sample input: 2 4 1 2 3 4 5 1 2 3 4 5 Sample output: 10 15 // C语言AC代码 #include <stdio.h> int n,c,t,sum; int main() { while( scanf("%d",&c)!=EOF ) { while(c--) { scanf("%d",&n); sum=0; while(n--) { scanf("%d",&am

C语言实现两数相加2018-09-23

/*给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807*//** * Definition for singly-linked list. * struct ListNode { * int val; * str