精华内容
下载资源
问答
  • C语言实现大数相加

    2019-10-13 16:07:35
    C语言实现大数相加 //利用栈来实现大数相加 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char s1[100]; char s2[100]; printf("请分别输入你的s1,s2\n"); gets(s1...

    C语言实现大数相加

    //利用栈来实现大数相加
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
    	char s1[100];
    	char s2[100];
    	printf("请分别输入你的s1,s2\n");
    	gets(s1);
    	gets(s2);
    	char *s1_p;
    	char *s2_p;
    	int *s3_p;
    	int i,temp;
    	s1_p=(char *)malloc(sizeof(char)*strlen(s1));
    	s2_p=(char*)malloc(sizeof(char)*strlen(s2));
    	s3_p=(int*)malloc(sizeof(int)*(strlen(s2)+strlen(s1)));
    	int s1_p_;
    	int s2_p_;
    	int s3_p_;
    	s1_p_=s2_p_=s3_p_=-1;
    	for(i=0;i<strlen(s1);i++){
    		s1_p[++s1_p_]=s1[i];
    	}
    	for(i=0;i<strlen(s2);i++){
    		s2_p[++s2_p_]=s2[i];
    	}
    	temp=0;
    	while(s1_p_>-1&&s2_p_>-1){
    		s3_p[++s3_p_]=(s1_p[s1_p_]+s2_p[s2_p_]-2*'0'+temp)%10;
    		temp=(s1_p[s1_p_]+s2_p[s2_p_]+temp-2*'0')/10;
    		s1_p_--;
    		s2_p_--;
    	}
    	if(s1_p_==-1){
    		while(s2_p_>-1){
    		s3_p[++s3_p_]=(s2_p[s2_p_]-'0'+temp)%10;
    		temp=(s2_p[s2_p_]-'0'+temp)/10;
    		s2_p_--;
    	}
    	}
    	else if(s2_p_==-1){
    		while(s1_p_>-1){
    		s3_p[++s3_p_]=(s1_p[s1_p_]-'0'+temp)%10;
    		temp=(s1_p[s1_p_]-'0'+temp)/10;
    		s1_p_--;
    	}
    	}
    		s3_p[++s3_p_]=temp; 
    	while(s3_p_>-1){
    		printf("%d",s3_p[s3_p_--]);
    	}
    	printf("\n");
    	return 0;
    }
    
    展开全文
  • c语言大数基本运算

    万次阅读 多人点赞 2018-06-09 21:46:46
    c语言--大数的基本运算 今天我想给大家介绍有关大数运算的方法,大数这里可以算是一个难点同样也是重点,以下的代码只针对非负数,大家在看之前可以自己思考一下。 大数加法 考虑到整型变量的范围有限,所以我们...

    c语言--大数的基本运算

    今天我想给大家介绍有关大数运算的方法,大数这里可以算是一个难点同样也是重点,以下的代码只针对非负数,大家在看之前可以自己思考一下。

    大数加法

    考虑到整型变量的范围有限,所以我们用字符数组来定义输入的两个大数,首先要使它们相应的位对齐,位数少的在前补0,然后各个位数的相加要考虑到进位,这里我定义为s。下面是全部代码:

    #include"stdio.h"
    #include"string.h"
    int main()
    {
        int i,m,len,len1;
        char a[100000],b[100000];
        scanf("%s",a);
        scanf("%s",b);
        len=strlen(a);
        len1=strlen(b);
    	m=(len>len1)?len:len1;
        for(i=0;i<50;i++)  
        a[50-1-i]=a[len-1-i];//使其右对齐
    	for(i=0;i<50-len;i++)
    	a[i]='0';//前面补0
    	for(i=0;i<50;i++) 
    	b[50-1-i]=b[len1-1-i];//使其右对齐
    	for(i=0;i<50-len1;i++)
    	b[i]='0';//前面补0
    	for(i=0;i<50;i++) 
    	c[i]='0';//初始化0
    	s=0;//进位
    	for(i=0;i<m;i++) 
    	{
    		c[50-1-i]=((a[50-1-i]-'0')+(b[50-1-i]-'0')+s)%10+'0';
    		s=((a[50-1-i]-'0')+(b[50-1-i]-'0')+s)/10;
    	} 
    	c[50-1-m]=s+'0';
    	printf("%s",c);
    }
    

    这里需要注意的是:大数用的是字符存储,不能直接相加,要先将其转化成数字再进行运算。
    emmm,我这里没有去掉前导0。

    大数阶乘

    阶乘和加法的原理一样都是相应的位进行运算然后要考虑到进位,这里我声明了一个自定义函数来计算阶乘,切记不要忽略了特殊情况。

    #include"stdio.h" 
    #include"string.h"
    void print_factorial(int n)//阶乘的函数
    {
    	if(n<0)
    	{
    		printf("error\n");
    		return;
    	}
    	else if(n==0)
    	{
    		printf("%d\n",1);
    		return;
    	}
    	int a[100000]={1},i,j;
    	int t=0,len=1,tem;//t为进位,len为位数 
    	for(i=2;i<=n;i++) 
    	{
    		t=0;
    		for(j=0;j<len;j++)
    		{
    			tem=a[j]*i;//乘积的值
    	    	a[j]=(tem+t)%10;//每一位分离出来
    			t=(tem+t)/10;
    			if(t!=0&&j==len-1)//判断位数是否增加
    			len++;
    		}
    	}
    	for(i=len-1;i>=0;i--) 
    	{
    		printf("%d",a[i]);//输出结果 
    	}
    }
    int main()
    {
    	int n;
    	scanf("%d",&n);//输入几的阶乘
    	print_factorial(n); 
    }
    

    这里需要注意的是:a数组是逆着存最后的结果的,所以输出时需要逆序输出。

    大数高阶幂

    这里我来举两个特殊的例子:计算3的100次方和浮点数的幂,其实高阶幂的算法和阶乘一样,只是部分地方需要改动,你只要理解了最核心的代码就问题不大。以下是3的100次方的代码:

    #include"stdio.h" 
    #include"string.h"
    int main()
    {
    	int a[1000]={1},i,j,t,tem,len=1;
    	char b[1000],c[1000];
    	gets(b);
    	for(i=1;i<=100;i++)//计算3^100 
    	{
    		t=0;
    		for(j=0;j<len;j++)
    		{
    			tem=a[j]*3;
    			a[j]=(tem+t)%10;//每一位分离出来 
    			t=(tem+t)/10;//t为进位 
    			if(t!=0&&j==len-1)
    			len++;
     		} 
    		
    	}//逆着存的 
    	j=0; 
    	for(i=len-1;i>=0;i--)
    	printf("%d",a[i]);//输出结果
    	printf("\n");
    }
    

    同样注意的是,这里也是逆序输出哦~

    我们再来看一下浮点数的高阶幂,它比整数要复杂的多,我们来看一下这种题的要求:

    本题中需要注意的点:
    1.先找到小数点的位置,纪录并去掉。
    2.去掉无意义的0。
    3.纪录小数点后有效位的位数。
    4.每次计算中都要去除无意义的0。
    5.计算最后结果中小数点的位置。
    6.将小数点加入到计算结果中。
    7.去掉最终结果中的无意义的0并输出。

    例如:
    输入:
    95.123 12
    输出:548815620517731830194541.899025343415715973535967221869852721
    完整代码如下:

    #include"stdio.h" 
    #include"string.h"
    int len=1; 
    void multiply(int a[],int n,int num)
    {
    	int i,j,t1,tem;//t1为进位
    	for(i=1;i<=n;i++) 
    	{
    		t1=0;
    		for(j=0;j<len;j++) 
    		{
    			tem=a[j]*num;
    			a[j]=(tem+t1)%10;
    			t1=(tem+t1)/10;
    			if(t1!=0&&j==len-1)
    			len++;
    		}
    	}//逆着存的 
    }
    int main()
    {
    	char R[10];
    	int n,num,t,i,j,l;//t为小数点的位数 
    	while(scanf("%s%d",R,&n)!=EOF)
    	{
    		int a[150]={1};
    		num=0,t=0;
    		for(i=0;i<strlen(R);i++)
    		{
    			if(R[i]=='.')
    			{
    				t=(strlen(R)-1-i)*n;
    			}
    			else
    			{
    				num=num*10+R[i]-48;
    			}
    		}
    		multiply(a,n,num);
    		if(len<=t)//数组a的位数小于小数位数 
    		{
    			printf(".");
    			for(i=0;i<t-len;i++)
    			printf("0");
    			for(i=len-1;i>=0;i--)
    			printf("%d",a[i]);
    		}
    		else
    		{
    			j=0;
    			while(a[j]==0&&j<t)//去掉末尾没用的零 
    			{
    				j++;
    			}
    			l=len;
    			for(i=len-1;i>=j;i--)//去掉前导0 
    			{
    				if(a[i]==0)
    				l--;
    				if(a[i]!=0)
    				break;
    			}
    			for(i=l-1;i>=j;i--)
    			{
    				if(i+1==t)
    				printf(".");
    				printf("%d",a[i]);
    			}
    		}
    		printf("\n");
    	} 
    }
    

    上面这个题比较复杂,要考虑的问题比较多,所以代码写起来比较繁琐,希望大家不会的可以好好琢磨一下,试着自己敲出来。

    大数乘法

     

    这是我认为这里面最难的一种运算,它是阶乘和加法的结合,首先我们要搞清楚多位数与多位数相乘的原理和过程并从中发现规律。
    其核心就是:两个大数,从末尾开始逐位相乘。相乘结果保存在另外一个数组里面(也从数组末尾开始依次往前保存)。然后将保存位置大于9的数进行进位处理。
    为了便于理解举个例子:

    我们通过举例可以发现相乘后的位数k不会超过m+n;这样我们在写代码时就便利不少。
    以下是完整代码:

    #include<stdio.h>  
    #include<math.h>  
    #include<string.h>  
    #define M 10005  
    char s1[M],s2[M],s[M];  
    int a[M],b[M],c[M];  
    int main()  
    {  
        int i,j,m,n,k;  
        while(~scanf("%s%s",s1,s2))  
        {  
            memset(c,0,sizeof(c));  
            n=strlen(s1);  
            m=strlen(s2);  
            k=n+m;//保证相乘后的位数不会大于k  
            printf("s1的长度=%d s2的长度=%d\n",n,m);  
           //把字符串s1s2逆序用数字排列  
            for(i=0; i<n; i++)  
                a[i]=s1[n-i-1]-'0';  
            for(i=0; i<m; i++)  
                b[i]=s2[m-1-i]-'0';  
              //乘运算
            for(i=0; i<n; i++)  
                for(j=0; j<m; j++)  
                    c[i+j]+=a[i]*b[j];  
            for(i=0; i<k; i++)  
            {  
                if(c[i]>=10)  
                {  
                    c[i+1]+=c[i]/10;  
                    c[i]%=10;  
                }  
            }  
         //去除前导0 
            i=k;  
            while(c[i]==0) i--;  
         //判断两个非负数之积是否为0,以及逆序打印c[]  
            if(i<0) printf("0");  
            else  
            {  
                for(; i>=0; i--)  
                    printf("%d",c[i]);  
            }  
            printf("\n");  
        }  
        return 0;  
    }  
    

    先介绍这几种大数的基本算法,还有大数减法和大数除法我没有提,大家可以下去好好想想,掌握了这些你在大数方面的算法题就没啥大问题。

     

    展开全文
  • C语言解决大数乘法

    2021-01-27 11:16:34
    手动模拟大数乘法(AB) #include<stdio.h> #include<string.h> int main() { char A[10000],B[10000];... int C[10000],D[10000],E...//将大数A,B以字符串形式输入 a=strlen(A); b=strlen(B);//记录A

    手动模拟大数乘法(AB)`

    
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char A[10000],B[10000];
        int C[10000],D[10000],E[20000];
        int a,b,c;
        int i,j;
        scanf("%s%s",&A,&B);//将大数A,B以字符串形式输入 
        a=strlen(A);
        b=strlen(B);//记录A,B长度 
        c=a+b-1;//由生活经验,可得c为a*b的最大长度 
        for(i=0;i<a;i++)
        {
            C[i]=A[i]-'0';//将A以数字形式转化到c数组中 
        }
        for(i=0;i<b;i++)
        {
            D[i]=B[i]-'0';//将B以数字形式转化到d数组中 
        }
        for(i=0;i<a;i++)
        {
            for(j=0;j<b;j++)
            {
                E[i+j]+=C[i]*D[j];
            }
        }//对应相乘,相乘结果存起来 
    
        for(i=c-1;i>0;i--)
        {
            E[i-1]+=E[i]/10;
            E[i]=E[i]%10;
        }//如果存的结果大于十,留下个位数,十位数进位 
        for(i=0;i<c;i++)
        {
            printf("%d",E[i]);
        }//输出 
        return 0;
    }
    
    

    高精度一般都是模拟过程,A+B也差不多思想,不过要考虑0的问题。
    谢谢点赞

    展开全文
  • c语言计算大数阶乘

    千次阅读 2019-02-19 17:57:30
     输入一个正整数n,输出n!的值。  其中n!=1*2*3*…*n。 算法描述  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位...

    问题描述

      输入一个正整数n,输出n!的值。
      其中n!=1*2*3*…*n

    算法描述

      n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数aA[0]表示a的个位,A[1]表示a的十位,依次类推。
      将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。

    输入格式

      输入包含一个正整数nn<=1000。

    输出格式

      输出n!的准确值。

    样例输入

    10

    样例输出

    3628800

    #include <stdio.h>
    #define N 10000
    int main()
    {
    	int a[N]={1};
    	int k=0,l=1,n;
    	int i,j;
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    	{
    		for(j=0;j<l;j++)
    		{
    			a[j]=a[j]*i+k;
    			k=a[j]/10000;
    			a[j]=a[j]%10000;
    		}
    		if(k)
    		{
    			a[j]=k;
    			l++;
    			k=0;
    		}
    	}
    	printf("%d",a[l-1]);
    	for(i=l-2;i>=0;i--)
    		printf("%04d",a[i]);
    	printf("\n");
    	return 0;
    }

     

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

    2019-02-26 21:06:45
    输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。 输出 一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 样例输入 88888888888888888888 ...
  • C语言 · 大数加法

    2017-02-25 20:52:00
    算法提高 大数加法 时间限制:1.0s 内存限制:256.0MB 问题描述  输入两个正整数a,b,输出a+b的值。 输入格式  两行,第一行a,第二行b。a和b的长度均小于1000位。 输出格式  一行,a+b的值。 ...
  • C语言大数加法

    2017-11-15 19:16:41
    A+B Problem II 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 I have a very simple problem for you. Given two integers A and B, your job is to calculate...A,B must be positive. ...输入 The f...
  • c语言大数阶乘

    2015-11-26 11:28:09
    大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入输入一个整数m(0 输出输出m的阶乘,并在输出...
  • C 语言实现的斐波那契数列(fibnacii),非递归方式。斐波拉契数列当输入值大于某个值时,基本的整形变量将无法保存其结果,因此本例使用字符串返回斐波拉契的结果,其中包括用字符串实现的大数加法。
  • C语言大数相加

    2013-09-13 17:34:49
    #include #include int main() { int f; int i,an,bn,k; char a[1000],b[1000]; int af[1000]={0},bf[1000]={0},c[1000];...=EOF) //输入字符串型的数字 { an=strlen(a); bn=strlen(b);
  • //字符数组存大数 scanf("%d", &n); for (j = 0; j ; j++) { scanf("%s%s", &a1, &a2); lengh_a1 = strlen(a1);//读输入到两个字符数组中的元素个数,用于转换成整形数组 lengh_a2 = strlen(a2); ...
  • c语言计算大数相加(高精度加法)

    千次阅读 2019-02-19 18:00:18
     输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 算法描述  由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。  定义一个数组A,A[0]用于存储a...
  • #define _CRT_SECURE_NO_WARNINGS #include #include #include #define N 1000 void Input(char number1[], char number2...//输入数据 void Change_str(char number[], int n);//数组前后互换 void Sub(cha
  • 输入N对位数不超过1000的正整数,求它们的和。 (编程使用strunc创建一个bigNum类型,并对’+’号运算符重载) 输入 第1行:一个正整数N,1≤N≤100; 下面有N行,每行2个整数:a和b,位数都不超过1000。 输出 一个正...
  • C语言大数相乘

    2013-05-29 16:30:55
    c语言实现两个大整数相乘,运行环境winTC开始输入第一个数的位数,之后输入第一个数,然后输入第二个数的位数,在输入第二个数
  • C语言大数

    2014-03-18 22:41:06
    // 输入 char a[MAX_LEN] 和 char b[MAX_LEB], 相加得出char pcRet[MAX_LEN +1 ] void Add(char * pcA, char *pcB, char *pcRet) {  int i = 0;  for (i = 0; i  {  c[i] = a[i] +
  • c语言大数相加

    2020-12-02 18:53:02
    大数相加 由于整型数的位数有限,因此整型数不能满足大整数...定义两个字符数组,并输入想要相加的大数。并分别计算出长度; #include <stdio.h> #include <string.h> int main(void) { char a[20],
  • c语言 大数排序

    2020-11-22 15:36:28
    输入 第一行为一个整数n,代表有n个人 接下来有n行,每行一个数字,序号从1到n 输出 找出n个数字中最大的 第一行输出序号 第二行输出该数 样例输入 4 12322 899231 214124124 92391 样例输出 3 214124124 提示 ...
  • C语言 大数相乘

    2018-04-07 20:43:12
    #include&lt;stdio.h&gt; #include&lt;string.h&gt; int main(){ char a[1001],b[1001],c[2002],d...输入两个非负数:\n"); scanf("%s%s",&amp;a,&amp;b); al=strlen(...
  • C语言大数相加实现

    2020-05-02 23:32:57
    由于大数不可存入int数组中,所以将数字转为字符输入char数组中,将两个数组数字从个位开始,模拟正常数字加法,需要进位1时设置进位标志,两数相加大于10时进位,见具体代码。 #include <string.h> #include ...
  • C语言大数加法

    2014-07-15 12:37:03
    输入输入不超过200位的非负整数,没有前导0 输出: 相加后的结果,没有多余前导0 测试数据; bigDataAddOne() 输入: 2 123456 123456 123456789 123456789 输出: Case...
  • C语言 大数运算(无限大小)头文件 支持 + , - , * , / , % ,> , ,>=,,==.流输入>>,流输出<<.
  • 学过C语言的同学都知道,C语言能表示最大的数就是long double了,但是就算是这样一个数也最多能计算170及以下的阶乘,而对于170以上的大数阶乘却无法用来表示。 因此下面介绍一种来计算大数阶乘的方法。 #include &...
  • /* 输入两个浮点数,输出它们中的大数 */ #include main() {  float x,y,c; /* 变量定义 */  printf("Please input x and y:\n"); /* 提示用户输入数据 */  scanf("%f%f",&x,&y);  c=x>y?x:y; /* ...
  • C语言大数运算-减法篇

    万次阅读 2017-04-03 17:04:03
    与加法类似,还是将用户的输入和结果放入变长的数组中然后模仿手工运算从低位到高位依次相减,会有三个需要解决的问题,其中前二个和大数加法的问题很相似,所以就不再详细说明。问题: 1.结果最多有多少位? 2....
  • 题目描述: 给出两个非空 的链表用来表示两个非负的整数。...输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 来源:力扣(LeetCode) 链接:htt...
  • C语言大数相乘的问题

    千次阅读 2014-02-28 16:12:34
    输入数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。接着有T组数据,每组数据只有一行,包括两个非负整数A和B。但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。但A和B的位数最大不会超过...
  • 输入一个正整数N,输出N的阶乘。 输入描述: 正整数N(0<=N<=1000) 输出描述: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 示例1 输入 复制 4 5 15 输出 复制 24 120 1307674368000...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 224
精华内容 89
关键字:

c语言输入大数

c语言 订阅