精华内容
下载资源
问答
  • 大整数

    千次阅读 2019-08-31 09:30:12
    大整数又称为高精度整数,其含义就是用基本数据类型无法存储其精度的整数。 1.大整数的存储 大整数的存储使用数组即可。例如定义int型数组d[1000],那么这个数组中的每一位就代表了存放的整数的每一位。如将整数...

    大整数又称为高精度整数,其含义就是用基本数据类型无法存储其精度的整数。

     

    1.大整数的存储

    大整数的存储使用数组即可。例如定义int型数组d[1000],那么这个数组中的每一位就代表了存放的整数的每一位。如将整数235813存储到数组中,则有d[0]=3,d[1]=1,d[2]=8,d[3]=5,d[4]=3,d[5]=2,即整数的高位存储在数组的高位,整数的低位存储在数组的低位。不反过来存储的原因是,在进行运算的时候都是从整数的低位到高位进行枚举,顺位存储和这种思维相合。因此在读入之后需要在另存为至d[]数组的时候反转一下。

    使用一个int类型的len来记录大整数的长度,并和d数组组合成结构体:

    struct bign{
        int d[1000];
        int len;
    };

    在定义了结构体后,需要马上初始化结构体,为了减少在实际输入代码时总是忘记初始化的问题,最好使用构造函数来初始化结构体的函数,函数名和结构体名相同、无返回值,因此非常好写,如下:

    struct bign{
        int d[1000];
        int len;
        bign() {
            memset(d,0,sizeof(d));
            len = 0;
        }
    };

    这样在每次定义结构体变量时,都会自动对该变量进行初始化。

    而输入大整数时,一般都是先用字符串读入,然后再把字符串另存为至bign结构体。由于使用char数组进行读入时,整数的高位会变成数组的低位,而整数的低位会变成数组的高位,因此为了让整数在bign中是顺位存储,需要让字符串倒着赋给d[]数组:

    bign change(char str[]) {    //将整数转换为bign
        bign a;
        a.len = strlen(str);    //bign的长度就是字符串的长度
        for(int i=0;i<a.len;i++) {
            a.d[i] = str[a.len-i-1]-'0';    //逆着赋值
        }
    return a;
    }

    如果要比较两个bign变量的大小,规则也很简单:先判断两者的len大小,如果不相等则以长的为大;如果相等,则从高位到低位进行比较,直到出现某一位不等,就可以判断两个数的大小。下面的代码直接依照了这个规则:

    int compare(bign a,bign b) {    //比较a和b的大小,a大、相等、a小分别返回1,0,-1
        if(a.len>b.len)
            return 1;    //a大
        else if(a.len<b.len)
            return -1;    //a小
        else {
            for(int i = a.len-1;i>=0;i--) {    //从高位往低位比较
                if(a.d[i]>b.d[i])
                    return 1;    //只要有一位a大,则a大
                else if(a.d[i]<b.d[i])
                    return -1;    //只要有一位a小,则a小
                }
             return 0; //两数相等
        }
    }
        

    下面实现比较两个大整数的代码:

    第一个数大于,等于,小于第二个数,分别输出1,0,-1;

    程序代码:

    #include<cstdio> 
    #include<cstring>
    //定义一个结构体存储大整数,并初始化 
    struct bign {
    	int d[1000];
    	int len;
    	bign() {
    		memset(d,0,sizeof(d));
    		len = 0;
    	}
    }; 
    
    //将读入的顺位字符串逆序打印到数组d[]
    bign change(char str[]) {
    	bign a;
    	a.len = strlen(str);	//bign的长度就是字符串的长度
    	for(int i=0;i<a.len;i++) {
    		a.len = str[a.len-i-1]-'0';		//逆着赋值 
    	}
    	return a; 
    }
    
    //比较规则
    int compare(bign a,bign b) {	//比较a和b的大小,a大、相等、a小分别返回1,0,-1
    	if(a.len>b.len)
    		return 1;
    	else if(a.len<b.len)
    		return -1;
    	else {
    		for(int i=a.len-1;i>=0;i--){
    			if(a.d[i]>b.d[i])
    				return 1;
    			else if(a.d[i]<b.d[i])
    				return -1;
    		}
    		return 0;
    	}
    }
    
    int main(){
    	char str1[1000],str2[1000];
    	scanf("%s%s",str1,str2);
    	bign a = change(str1);
    	bign b = change(str2);
    	printf("%d",compare(a,b));
    	return 0;
    }
    

    运行结果:

     

    展开全文
  • 最大整数

    千次阅读 2017-12-30 22:25:00
    最大整数 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=3时,3 个整数13,312,343,连成的最大整数为:34331213 又如:n=...

    最大整数

    时间限制: 1 Sec  内存限制: 128 MB
    [提交][状态][讨论版]

    题目描述

    设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=3时,3
    个整数13,312,343,连成的最大整数为:34331213
    又如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613

    输入

    N 
    N个数

    输出

    连接成的多位数

    样例输入

    3 
    121 21 3 

    样例输出

    321121
     
    /*由题意知,我们会理所应当的选着则数大排在前面,但有两个数 31 3 显然31 大于 3 这个字符串,但331 大于313 ;*/
     # include<iostream> 
    using namespace std; 
    int main()
    { 
        int n; 
        cin>>n;  
        string a[n];
        for(int i=0;i<n;i++) 
        cin>>a[i]; 
        for(int i=0;i<n-1;i++) 
        for(int j=i+1;j<n;j++) //对所有的a[i]+a[j]与a[j]+a[i]比较 
        { 
            if(a[j]+a[i]>a[i]+a[j]) 
            { 
                string s; 
                s=a[i]; 
                a[i]=a[j]; 
                a[j]=s;
            }
         }
         for(int i=0;i<n;i++)
         cout<<a[i]; 
         return 0; 
    } 

     

     

     

    展开全文
  • 大整数减法

    千次阅读 2019-02-05 21:59:48
    本篇介绍大整数相减(两个正数相减)

    本篇介绍大整数相减(两个正数相减)
    与大整数加法运算相比,减法运算稍微复杂了些,因为要考虑当结果为负数时候的情况。根据减法运算法则可以得出两个整数相减为正数的情况。这样想来,只需要在两个正的大整数相减前比较大小即可得出另外一种情况。

    例:

    • 11 - 20 = - ( 20 - 11)只需算出 20 - 11 即可获得答案
    • 为了确定最终结果得符号(+ / -),需要比较两个数得大小

    所以最终功能的实现由以下部分组成:

    1. 逆序存放数字(对齐整数的个位,便于计算)
    2. 判断两个整数大小(确定最终结果为正数还是负数)
    3. 用数组计算结果
    4. 根据两个整数的大小输出结果
    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;
    void swap(int a[], int len_a, int b[], int len_b)
    {
    	int MAX = max(len_a, len_b);
    	for (int i = 0; i < MAX; i++)
    	{
    		swap(a[i], b[i]);
    	}
    }
    int main()
    {
    	int a[1001] = { 0 };
    	int b[1001] = { 0 };
    
    	string A, B;
    	cin >> A >> B;
    
    	int len1, len2;
    	len1 = A.length();
    	len2 = B.length();
    	int flag = 0;//标记输出结果为正或是负
    
    	for (int i = len1 - 1, k = 0; i != -1; i--)//逆序存放
    	{
    		a[k] = A[i] - '0';
    		k++;
    	}
    
    	for (int i = len2 - 1, k = 0; i != -1; i--)
    	{
    		b[k] = B[i] - '0';
    		k++;
    	}
    	
    	if (len1 < len2)//比较大小
    	{
    		flag = 1;
    		swap(a, len1, b, len2);
    		swap(len1, len2);
    	}
    	else if (len1 == len2)
    	{
    		for (int i = len1 - 1; i >= 0; i--)
    		{
    			if (a[i] == b[i])
    				continue;
    			else if (a[i] > b[i])
    				break;
    			else
    			{
    				flag = 1;
    				swap(a, len1, b, len2);
    				swap(len1, len2);
    				break;
    			}
    		}
    	}
    	
    	int down = 0,max = len1 >= len2 ? len1 : len2;
    	for (int i = 0; i < max; i++)//模拟减法
    	{
    		a[i] =a[i] - b[i] - down;
    		down = 0;
    		if (a[i] < 0)
    		{
    			down = 1;
    			a[i] += 10;
    		}
    	}
    	
    	if (flag)
    	{
    		cout << "-";
    	}
    	
    	int i;
    	for (i = max - 1; a[i] == 0; i--);//忽略空格
    	for (;i >= 0; i--)
    	{
    		cout << a[i];
    	}
    	return 0;
    }
    
    展开全文
  • 大整数相乘

    千次阅读 2018-08-02 21:49:59
    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。 输入描述: 空格分隔的两个字符串,代表输入的两个大整数   输出描述: 输入的乘积,用字符串表示 ...


    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

    输入描述:

    空格分隔的两个字符串,代表输入的两个大整数


     

    输出描述:

    输入的乘积,用字符串表示

    示例1

    输入

    72106547548473106236 982161082972751393

    输出

    70820244829634538040848656466105986748

    解题思路

    在下面的例子程序中,用unsigned an1[200]和unsigned an2[200]分别存放两个乘数,用aResult[400]来存放积。计算的中间结果也都存在aResult中。aResult长度取400是因为两个200位的数相乘,积最多会有400位。an1[0], an2[0], aResult[0]都表示个位。
    计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。
    现以 835×49为例来说明程序的计算过程。
    先算835×9。5×9得到45个1,3×9得到27个10,8×9得到72个100。由于不急于处理进位,所以835×9算完后,aResult如下:
     
    接下来算4×5。此处4×5的结果代表20个10,因此要 aResult[1]+=20,变为:
     
     

    再下来算4×3。此处4×3的结果代表12个100,因此要 aResult[2]+= 12,变为:


    最后算 4×8。此处4×8的结果代表 32个1000,因此要 aResult[3]+= 32,变为:

     

    乘法过程完毕。接下来从 aResult[0]开始向高位逐位处理进位问题。aResult[0]留下5,把4加到aResult[1]上,aResult[1]变为51后,应留下1,把5加到aResult[2]上……最终使得aResult里的每个元素都是1位数,结果就算出来了:

     
    总结一个规律,即一个数的第i位和另一个数的第j位相乘所得的数,一定是要累加到结果的第i+j位上。这里i, j都是从右往左,从0开始数。


    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    public class Test1{
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            String[] arr = s.split("\\s+");
            boolean flag=false;
            char [] ar1,ar2;
            
            if(arr[0].charAt(0)=='-'&&arr[1].charAt(0)=='-'){
                 ar1 = arr[0].substring(1).toCharArray();
                 ar2 = arr[1].substring(1).toCharArray();
            }
            else if(arr[0].charAt(0)=='-'){
                flag=true;
                ar1 = arr[0].substring(1).toCharArray();
                ar2 = arr[1].toCharArray();
            }
            else if(arr[1].charAt(0)=='-'){
                flag=true;
                ar2 = arr[1].substring(1).toCharArray();
                ar1 = arr[0].toCharArray();
            }
            else{
                ar1 = arr[0].toCharArray();
                ar2 = arr[1].toCharArray();
            }
            for(int i=0;i<ar1.length;i++){
                ar1[i]=(char) (ar1[i]-'0');
            }
            for(int i=0;i<ar2.length;i++){
                ar2[i]=(char) (ar2[i]-'0');
            }
            int [] result=new int[ar1.length+ar2.length];
            
            for(int i=ar2.length-1;i>-1;i--){
                for(int j=ar1.length-1;j>-1;j--){
                    result[ar1.length-1-j+ar2.length-1-i]=ar1[j]*ar2[i]+result[ar1.length-1-j+ar2.length-1-i];    
                }
            }
            
            for(int i=0;i<ar1.length+ar2.length;i++){
                if(result[i]>9){
                    int temp=result[i]/10;
                    result[i]=result[i]%10;
                    result[i+1]=result[i+1]+temp;
                    
                }
            }
            
            StringBuilder buffer=new StringBuilder();
            if(flag) buffer.append('-');
            int counter=0;
            if(result[ar1.length+ar2.length-1]==0) counter=1;
            for(int i=ar1.length+ar2.length-2;i>-1;i--){
                if(result[i+1]==0&&result[i]==0) counter++;
                else break;
            }
            
            for(int i=ar1.length+ar2.length-counter-1;i>-1;i--){
                buffer.append(result[i]);
            }
            System.out.println(buffer.toString());
        }
    }

    展开全文
  • C语言大整数加法

    千次阅读 多人点赞 2019-03-21 12:30:55
    C语言实现大整数加法 题目描述: 1:大整数加法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和。 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 输出 一行,即...
  • 大整数乘法

    万次阅读 2018-09-29 15:00:48
    设计一个有效的算法,可以计算两个n位大整数的乘法运算。 如果按照我们日常的计算方法,应该就是将两个数逐位相乘,最后加起来得到最终的结果。由于是大整数乘法,那么我们用string来存储这两个数,因为是要做乘法,...
  • 多个整数拼接成最大整数

    千次阅读 2019-03-10 19:11:59
    输入n个正整数,要求把他们拼接成最大的整数输出。 举例: 输入3, 30 拼接成的最大整数是:330 输入1, 3, 30, 305, 346, 5, 58, 8 拼接成最大整数是: 85853463305301 思路解析: 这道题一旦陷入常规思路...
  • Python3中有大整数和小整数之分。区分的标准在于是否大于sys.maxsize。小整数一般是4字节或8字节表示,差异在于Cython的编译器,32位小整数一般用32位表示,64位用64位二进制表示。网上很多教程里说整数只能小于sys....
  • Java实现大整数乘法

    万次阅读 多人点赞 2019-07-21 15:56:38
    计算两个大整数相乘的结果。 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import java.math.BigInteger; public class BigNumber { /* * 参数A:进行乘法运算的大整数A,用字符串形式表示 * 参数B:...
  • C++ 大整数加法

    千次阅读 2019-04-10 20:48:35
    输入两个大整数(100位以内),将结果输出 测试用例1 请输入一个大整数A:111111111 请输入一个大整数B:00005 结果:111111116 请按任意键继续. . . 测试用例2 代码 理论上,位数可以无限,实际使用时受内存空间...
  • C++大整数

    千次阅读 2014-04-22 22:23:23
    这两天一直在利用一些课余的琐碎时间在写C++大整数,昨天晚上终于基本完工了,利用到的思想就是: 用一个连续的int型的存储空间去表示大整数和进行运算。在运算时将该大整数拆分成一个多项式,然后按照 多项式的...
  • 大整数加法

    千次阅读 2014-11-14 13:03:03
    题目 - 大整数加法   描述 求两个不超过400位的非负整数的和 关于输入 首先输入N,即测试数据的组数 每组测试数据输入: 一行,每行是两个不超过400位的非负整数,...
  • C++大整数运算

    万次阅读 2017-02-22 12:50:30
    C++大整数运算系列文章讲述了实现大整数四则运算的基本思路和方法,对算法做简单的介绍并采用C++代码做进一步说明。本文并不试图写成一篇教程,而是对实现过程进行整理和概括。
  • 【问题描述】设有n个正整数(n<=20),将它们联接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213。 又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613...
  • 大整数取模

    千次阅读 2016-12-17 22:31:55
    问题描述: 输入正整数n和m,输出n mod m的值。 问题分析:根据n和m的取值范围,可以取n为char*类型,m为int类型。...对于输入的n,把大整数写成“自左向右”的形式:1234=((1*10+2)*10)*10+4,然后
  • 贪心之最大整数

    千次阅读 2018-04-19 10:55:27
    描述设有n(n≤20)个正整数(每个在int范围内),将它们连接成一排,组成一个最大的多位整数。例如n=3,3个整数分别是13、312和343,连接成最大的整数为34331213。输入第一行1个整数n第二行为n个正整数,分别用空格...
  • 大整数加法OJ

    千次阅读 2019-08-26 10:43:37
    06:大整数加法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和。 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 输出 一行,即相加后的结果。结果里不能有多余...
  • C++大整数相加

    千次阅读 2017-12-15 19:40:55
    C++大整数相加算法,采用数组保存大整数,然后进行大整数的相加。#include #include char *LongAdd(char *b, char *c); int main() { int a,n,i; char *b=new char[1000]; char *c=new char[1000]; scanf("%d",
  • 大整数类BigInteger

    千次阅读 多人点赞 2016-11-21 20:09:44
    大整数类BigInteger 跟踪调试后的感悟。 1、=(long long num)该赋值方式实际运用价值不大,输入数据一长容易越界。=(const string&amp; str)赋值方式极具实用价值,只要string不越界,就可以处理该整数。 2、...
  • C++大整数

    千次阅读 2018-08-06 20:36:40
    由于面向对象编程复杂易错,且在OI中可以被替代,在绝大部分OI相关书籍中面向对象编程被略过,对于大多OI选手,编写完整的大整数类并不容易。 以下C++大整数类的完整实现(但在比赛中不建议去编写,建议C语言实现...
  • 分治法-大整数乘法

    万次阅读 多人点赞 2019-01-07 18:20:03
    问题分析: 在计算机上处理一些大数据相乘时,由于计算机硬件的限制,不能直接进行相乘得到想要的结果。可以将一个大的整数乘法分而治之,将大问题变成小问题,变成简单的...ah表示大整数a的高位,al表示大整数a的...
  • 大整数的因子

    千次阅读 2017-03-19 10:59:35
    题目: 描述 已知正整数k满足2 输入一个非负整数c,c的位数输出若...思路:跟大整数除法很像,其实就是大整数除法的低配版,代码很短,建议搞明白这个后去学习下大整数除法。就是根据小学学习的除法计算方法。高位
  • 数据结构大整数运算

    千次阅读 2018-01-02 20:24:39
    要求完成一个支持长度为位以下的十进制的大整数运算系统,能够完成大整数的加法、减法、乘法3种运算功能。 (1)由于大整数的位数较多从键盘输入较麻烦,且容易出错,因此大整数运算系统应具备从文本文件中读入...
  • 要想对大整数进行精确的四则运算,首先要解决大整数的输入问题,大整数的输入不能基本的变量类型去接收,而应当使用字符串,该程序使用顺序表实现了大整数的输入处理,存储及输出操作。同时对输入数据前导有零的情况...
  • Python 实现大整数乘法算法

    万次阅读 多人点赞 2019-09-16 01:09:27
    我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法。今天,我们来介绍一种时间复杂度为 O (n ^ log 3) 的大整数乘法(log 表示以 ...
  • 大整数除法

    千次阅读 2018-07-18 21:51:59
    这个大整数除法指的是求出 a 除以 b 的整数位结果, 当然余数也可以求, 但不是求精确的小数结果. 举个例子来说思路: a = 17693 b = 23 求 a / b len(a) = 5, len(b) = 2 那么 1. 17693 - 23000 &amp;lt; 0, ...
  • Java 大整数减法

    千次阅读 2018-05-12 14:10:01
    每个大整数不超过200位,不会有多余的前导零。 输出 一行,即所求的差。 样例输入 9999999999999999999999999999999999999 9999999999999 样例输出 9999999999999999999999990000000000000 impor...
  • 大整数乘法求解

    2015-09-29 08:18:27
    输入两大整数(都是200位内 非负 没前导零) 求其相乘 没看出什么问题 提交网站却显示WA 求点拨

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,173
精华内容 66,069
关键字:

大整数