大整数的四则元算

在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。

1.加法。

如:

Input: 123456789123456789123456789

1

Output:123456789123456789123456790

输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。

 1加法模板
 2
 3 #include<stdio.h>
 4 #include<string.h>
 5 int max(int x,int y)
 6 {
 7     if(x>y)
 8         return x;
 9     else
10         return y;
11 }
12
13 int main(void)
14 {
15
16     char str1[510],str2[510];
17     while(scanf("%s %s",str1,str2)==2)
18     {
19
20         int a[510]={0},b[510]={0},c[510]={0},i;
21         int m,n,max1=0;
22         m=strlen(str1);
23         n=strlen(str2);
24         max1=max(m,n);
25         for(i=0;i<max1;i++)
26         {
27             a[m-i-1]=str1[i]-48;
28             b[n-i-1]=str2[i]-48;
29         }
30         for(i=0;i<max1;i++)
31             c[i]=a[i]+b[i];
32         for(i=0;i<max1;i++)
33         {
34             c[i+1]=c[i]/10+c[i+1];
35             c[i]=c[i]%10;
36         }
37         if(c[max1]!=0)
38         {
39             for(i=max1;i>=0;i--)
40                 printf("%d",c[i]);
41         }
42         else
43         {
44             for(i=max1-1;i>=0;i--)
45                 printf("%d",c[i]);
46         }
47         printf("\n");
48     }
49     return 0;
50 }

2.减法

Input:123456789123456789

1

Output:123456789123456788

原理同加法一样(这里假设第一个数大于第二个数

1 减法模板
 2
 3 #include<stdio.h>
 4
 5 #include<string.h>
 6
 7 int main(void)
 8 {
 9     char s1[505],s2[505];
10     while(scanf("%s%s",s1,s2)==2)
11
12     {
13         int i,j,len1,len2;
14         int a[105]={0},b[105]={0};
15         len1=strlen(s1);
16         len2=strlen(s2);
17         for(i=len1-1,j=0;i>=0;i--,j++)
18         {
19             a[j]=s1[i]-48;
20         }
21         for(i=len2-1,j=0;i>=0;i--,j++)
22         {
23             b[j]=s2[i]-48;
24         }
25         for(i=0;i<len1;i++)
26         {
27             a[i]=a[i]-b[i];
28             if(a[i]<0)
29             {
30                 a[i]+=10;
31                 a[i+1]--;
32             }
33         }
34         i=len1-1;
35         while(a[i]==0)
36         {
37             i--;
38         }
39         for(;i>=0;i--)
40         {
41             printf("%d",a[i]);
42         }
43         printf("\n");
44     }
45     return 0;
46 }

3.乘法

原理上也是采用数组模拟。

a[i]   12345

b[j]        23

用c[k]来保存每次的运算结果,k=i+j;

c[i+j]=c[i+j]+a[i]*b[j];

这里来模拟一次乘法过程:

123

*   12

--------------

246

+ 123

--------------

1476

 1 乘法模板
 2
 3 #include<iostream>
 4 #include<string.h>
 5 using namespace std;
 6
 7
 8 int main(void)
 9 {
10     char s1[510],s2[510],temp[510];
11     int a[510],b[510],c[1010];
12     while(scanf("%s%s",s1,s2)==2)
13     {
14         int i,j,h;
15         int len1,len2;
16         if(strlen(s1)<strlen(s2))
17         {
18             strcpy(temp,s1);
19             strcpy(s1,s2);
20             strcpy(s2,temp);
21         }
22         len1=strlen(s1);
23         len2=strlen(s2);
24         memset(c,0,sizeof(c));
25         for(i=len1-1,j=0;i>=0;i--,j++)
26         {
27             a[j]=s1[i]-48;
28         }
29         for(i=len2-1,j=0;i>=0;i--,j++)
30         {
31             b[j]=s2[i]-48;
32         }
33         for(i=0;i<len2;i++)
34         {
35             for(j=0;j<len1;j++)
36             {
37                 c[i+j]=a[j]*b[i]+c[i+j];
38             }
39         }
40         for(i=0;i<2*len1;i++)
41         {
42             if(c[i]>=10)
43             {
44                 c[i+1]=c[i+1]+c[i]/10;
45                 c[i]=c[i]%10;
46             }
47         }
48         i=2*len1;
49         while(c[i]==0)
50         {
51             i--;
52         }
53         if(i<0)
54         {
55             printf("0\n");
56         }
57         else
58         {
59             for(;i>=0;i--)
60                 printf("%d",c[i]);
61             printf("\n");
62         }
63     }
64     return 0;
65 }

4.除法

除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。

 1 除法模板
 2
 3 #include<stdio.h>
 4 #include<string.h>
 5
 6 int len1,len2;
 7 char s1[905];
 8 char s2[905];
 9 int re[905];
10
11 void sub()
12 {
13     int i=0;
14     int j;
15     while(1)
16     {
17         if(s1[i]==‘0‘)
18             i++;
19         else
20         {
21             j=i;
22             break;
23         }
24     }
25     for(;i<len2;i++)
26     {
27         s1[i]=s1[i]-s2[i]+‘0‘;
28     }
29     for(i=len2-1;i>j;i--)    //低位开始检测是否小于0
30     {
31         if(s1[i]<‘0‘)
32         {
33             s1[i]+=10;
34             s1[i-1]--;
35         }
36     }
37 }
38
39 int main(void)
40 {
41     int i,p;
42     while(scanf("%s%s",s1,s2)==2)
43     {
44         len1=strlen(s1);
45         len2=strlen(s2);
46         if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0
47         {
48             printf("0\n");
49             continue;
50         }
51         p=0;
52         while(1)
53         {
54             re[p]=0;
55             while(strncmp(s1,s2,len2)>=0)       //一直进行减法,直到不能减为止
56              {
57                 sub();
58                 re[p]++;
59             }
60             p++;
61             if(len1==len2)
62                 break;
63             for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算
64              {
65                 s2[i+1]=s2[i];
66             }
67             s2[0]=‘0‘;
68             len2++;
69             s2[len2]=‘\0‘;
70         }
71         i=0;
72         while(1)
73         {
74             if(re[i]==0)
75                 i++;
76             else
77                 break;
78         }
79         for(;i<p;i++)
80             printf("%d",re[i]);
81         printf("\n");
82     }
83     return 0;
84 }

 1 除法模板
 2
 3 #include<stdio.h>
 4 #include<string.h>
 5
 6 int len1,len2;
 7 char s1[905];
 8 char s2[905];
 9 int re[905];
10
11 void sub()
12 {
13     int i=0;
14     int j;
15     while(1)
16     {
17         if(s1[i]==‘0‘)
18             i++;
19         else
20         {
21             j=i;
22             break;
23         }
24     }
25     for(;i<len2;i++)
26     {
27         s1[i]=s1[i]-s2[i]+‘0‘;
28     }
29     for(i=len2-1;i>j;i--)    //低位开始检测是否小于0
30     {
31         if(s1[i]<‘0‘)
32         {
33             s1[i]+=10;
34             s1[i-1]--;
35         }
36     }
37 }
38
39 int main(void)
40 {
41     int i,p;
42     while(scanf("%s%s",s1,s2)==2)
43     {
44         len1=strlen(s1);
45         len2=strlen(s2);
46         if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0
47         {
48             printf("0\n");
49             continue;
50         }
51         p=0;
52         while(1)
53         {
54             re[p]=0;
55             while(strncmp(s1,s2,len2)>=0)       //一直进行减法,直到不能减为止
56              {
57                 sub();
58                 re[p]++;
59             }
60             p++;
61             if(len1==len2)
62                 break;
63             for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算
64              {
65                 s2[i+1]=s2[i];
66             }
67             s2[0]=‘0‘;
68             len2++;
69             s2[len2]=‘\0‘;
70         }
71         i=0;
72         while(1)
73         {
74             if(re[i]==0)
75                 i++;
76             else
77                 break;
78         }
79         for(;i<p;i++)
80             printf("%d",re[i]);
81         printf("\n");
82     }
83     return 0;
84 }
时间: 2024-11-06 23:57:41

大整数的四则元算的相关文章

自动生成30道四则元算题目

主要分成三部分来解决这个问题. 输入:自动输入 功能实现:生成6个随机数,有两个分子,两个分母,一个控制运算符,一个控制整数算式还是分数算式 输出:根据控制整数算式还是分数算式的随机数,进行相应的输出 #include<iostream>#include<string>#include<time.h>using namespace std;void main(){  int a[6],b=0,c,e;  string str="+-*/";  for

作业五 四则元算 测试与封装

未封装的程序: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Size { public static void main(String[] args) { // TODO Auto-generated method stub myframe f=new myframe(); } } class myframe extends JFrame { JLabel L1=new JLabel

四则元算(家长以后再也不用为给孩子出题发愁了)

//本程序能够随机产生100以内的整数的四则运算 #include "stdafx.h"#include "stdio.h"#include <stdlib.h>#include <time.h>void disply(){ srand(time(NULL)); int i; for(i=0;i<30;i++) { int a=rand()%100; int b=rand()%100; int c=rand()%4; if(c==0){

html+js实现四则元算计算器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

第二章-第三题(四则元算需求文档编写、上传至GitHub与修改)-By郭青云

题目描述: 完成小组的“四则运算”项目的需求文档(使用Markdown写文档),尝试同组成员在各自PC上修改同一文档后,如何使用Git命令完成GitHub上的文档的更新,而不产生冲突.并验证GitHub上的文档确实是最新的文档. 步骤: a)编写文档 b)从代码库中pull项目至本地分支 c)修改需求文档 d)提交修改 d)合并修改的内容

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

算法---大整数相加

原文:算法---大整数相加 开通博客开始第一次写发表算法博客.深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了.链表,指针也只知道一个概念了.用得没以前熟练了.所以后续更新的算法题我都是基于C#语法的.算法主要体现的是解题思路.跟题目一样,本次算法主要实现大数据相加. 解题思路: 1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =>12345 和{9,6,5,9,5}

大整数乘法python3实现

由于python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,但是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位置开始算的.代码如下: import sys def list2str(li): while li[0]==0: del li[0] res='' for i in li: res+=str(i) return res def multi(stra,strb): aa=list(stra) bb=l

大整数进制转换

题目描述: 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入: 多组数据,每行为一个长度不超过30位的十进制非负整数. (注意是10进制数字的个数可能有30个,而非30bits的整数) 输出: 每行输出对应的二进制数. 样例输入: 0 1 3 8 样例输出: 0 1 11 1000 来源: 2008年北京大学软件所计算机研究生机试真题 1.自己想的解法特别的复杂 #include<stdio.h> #include<string.h> //基本思路,先把大整数拆