精华内容
下载资源
问答
  • C语言精度乘法

    2021-01-08 16:11:49
    前言 菜鸟的学习笔记,在之前就有做过高精度的乘法...这里我们用a和b数组来存储需要计算的两个大数字,因为在C语言中字符数组可以直接输入字符串进去,如果用数字数组的话就需要一位一位去输入,很麻烦。但是这样存进

    前言

    菜鸟的学习笔记,在之前就有做过高精度的乘法运算以及高精度阶乘运算,现在再写一遍加深一下印象。有错指出,虚心接受。


    一、思考如何实现高精度乘法

    因为C语言中无法直接计算很大的数字,所以另辟蹊径,用数组存储大数字,然后一位一位进行计算,就像用笔计算一样。这是大致的思考方向,接下来就用代码来实现。

    二、代码实现

    1.设置好需要的数组和一些变量

    这里我们用a和b数组来存储需要计算的两个大数字,因为在C语言中字符数组可以直接输入字符串进去,如果用数字数组的话就需要一位一位去输入,很麻烦。但是这样存进去的数字是字符形式的,所以用第三块代码来转换为数字并存储到num1和num2数字数组中,并从最后一个位置存方便计算。

    	int num1[1000]={0},num2[1000]={0},num[1000]={0},sum[1000]={0};
    	char a[1000]={0},b[1000]={0}; 
    	
    	scanf("%s%s",a,b);
    	int l1=strlen(a);
    	int l2=strlen(b);
    	
    	int i=0;
    	for(;i<l1;i++)
    	num1[999-i]=a[l1-1-i]-'0';
    	for(i=0;i<l2;i++)
    	num2[999-i]=b[l2-1-i]-'0';
    

    2.正题,计算

    假设计算23*56,先用3去一位一位乘以56中的每一位数,并将其相加到sum数组中,然后再计算2去乘以56中的每一位数,再加到sum中,类推。
    但我们发现,3乘完之后相加是168存在num数组中也是,sum数组中也是。用2去乘56得到是112,存到num中是112,在sum中相加是168+112,但答案是错的。
    在纸上写一遍就可以发现问题所在了,实际上是要加1120的。而解决方法就是num[999-k-j],因为num所有元素都是0,只需要在j个0前存储就行了,所以-j就可以解决这个问题。

    	int j,k,t1=0,t2=0;
    	for(j=0;j<l1;j++)
    	{
    		t1=0,t2=0;
    		for(k=0;k<l2+1+j;k++)  //相乘时,进位最多往前进一位,所以k<l2+1,而+j是为了相加而设置的,因为每次相加的数最后都会比前面多0而导致可能会多一位,这不会影响乘法的计算,因为num1和num2都已经是0了。
    		{
    			num[999-k-j]=num1[999-j]*num2[999-k]+t1;  //位相乘+进位来的数
    			t1=num[999-k-j]/10;        //处理进位
    			num[999-k-j]=num[999-k-j]%10;
    			
    			sum[999-k]=num[999-k]+sum[999-k]+t2;  //相当于高精度加法,差不多的意思。
    			t2=sum[999-k]/10;
    			sum[999-k]=sum[999-k]%10;	
    		}
    		memset(num, 0, sizeof(num));  //将num数组清0
    	}
    

    3.输出

    因为我们的数都是从最后面开始存的,且前面都是0,所以可以判断是否第一次遇到非0来进行输出。

    	i=0;
    	while(sum[i]==0)
    	i++;
    	
    	for(;i<1000;i++)
    	printf("%d",sum[i]);

    贴一下完整的代码

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main()
    {
    	int num1[1000]={0},num2[1000]={0},num[1000]={0},sum[1000]={0};
    	char a[1000]={0},b[1000]={0}; 
    	
    	scanf("%s%s",a,b);
    	int l1=strlen(a);
    	int l2=strlen(b);
    	
    	int i=0;
    	
    	for(;i<l1;i++)
    	num1[999-i]=a[l1-1-i]-'0';
    	for(i=0;i<l2;i++)
    	num2[999-i]=b[l2-1-i]-'0';
    	
    	int j,k,t1=0,t2=0;
    	for(j=0;j<l1;j++)
    	{
    		t1=0,t2=0;
    		for(k=0;k<l2+1+j;k++)
    		{
    			num[999-k-j]=num1[999-j]*num2[999-k]+t1;
    			t1=num[999-k-j]/10;
    			num[999-k-j]=num[999-k-j]%10;
    			
    			sum[999-k]=num[999-k]+sum[999-k]+t2;
    			t2=sum[999-k]/10;
    			sum[999-k]=sum[999-k]%10;	
    		}
    		memset(num, 0, sizeof(num));
    	}
    	
    	i=0;
    	while(sum[i]==0)
    	i++;
    	
    	for(;i<1000;i++)
    	printf("%d",sum[i]);
    }

    总结

    主要是知道乘法在纸上运算的方法就行,在处理好一些细节就行。

    展开全文
  • C语言精度加法

    2020-12-25 21:05:04
    字符数组可以连续输入但又不是整型数字而是字符,而整型数组可以输入数字但又不能连续输入,所以两者结合一下就可以解决。 代码如下: 1.先将大数字通过字符数组存入。 #include <stdio.h> int main() { ...

    前言

    发现博客可以用来记录自己的学习过程,真不错。

    第一次遇到需要高精度计算的题目,一开始傻乎乎的直接计算发现不得行,原来还能这样。


    主要思路:

    字符数组可以连续输入但又不是整型数字而是字符,而整型数组可以输入数字但又不能连续输入,所以两者结合一下就可以解决。


    代码如下:

    1.先将大数字通过字符数组存入。

    #include <stdio.h>
    int main()
    {
     char num1[200]={0},num2[200]={0};
     int a[200]={0},b[200]={0},num[200]={0},j=0,k=0,l1=0,l2=0,l,i=0,m,n;
     
     scanf("%s",num1);	//num1和num2用来存大型数组
     scanf("%s",num2);   

    2.计算出字符串长度方便后面使用

    while(num1[l1]!='\0') l1++;
    while(num2[l2]!='\0') l2++;	//计算长度
    
    if(l1>l2) l=l1;
    else l=l2;			//找出哪个数字更大,方便后面及时停止循环
    for(m=0,j=199;l1!=m;j--,m++)
    	a[j]=num1[l1-m-1]-'0';	   //将字符数组中的数字赋值到数字数组中
    for(n=0,k=199;l2!=n;k--,n++) 	   //a,b为存储大型数字的整型数组
    	b[k]=num2[l2-n-1]-'0';     //从数组的最后一位开始复制到整型数组的最后一位

    3.重点就是计算,加法的计算还是简单点的,主要方法是个位为两个数各位相加再求余,然后/10进位到百位,依次类推。

    int t = 0;
    for(;i<l+1;i++)             	  	   //l+1为更大的数长度加一,因为最大也只是往前加个一
      {
        num[199-i]=(a[199-i]+b[199-i]+t)%10;   //t为小位进位过来的数
        t=(a[199-i]+b[199-i]+t)/10		   
      }

    4.计算已经做好,只需要再把数组前面的0全部去除输出就行

     i=0;
     for(;i<200;i++)
     {
      if(num[i]!=0)
      break;                  //从左往右依次输出,遇到0跳过,第一次遇到非0跳出循环
     }
     
     for(;i<200;i++)
     printf("%d",num[i]);

    完整代码

    #include <stdio.h>
    int main()
    {
     char num1[200]={0},num2[200]={0};
     int a[200]={0},b[200]={0},num[200]={0},j=0,k=0,l1=0,l2=0,l,i=0,m,n;
     
    	scanf("%s",num1);
    	scanf("%s",num2);     
    
    	while(num1[l1]!='\0') l1++;
    	while(num2[l2]!='\0') l2++;     
    
    	if(l1>l2) l=l1;
    	else l=l2;            
    	
    	for(m=0,j=199;l1!=m;j--,m++) 
    	a[j]=num1[l1-m-1]-'0';
    	for(k=199,n=0;l2!=n;k--,n++) 
    	b[k]=num2[l2-n-1]-'0';    
    	
    	int t = 0;
    	for(;i<l+1;i++)
    	{
    		num[199-i]=(a[199-i]+b[199-i]+t)%10;
    		t=(a[199-i]+b[199-i]+t)/10;
    	}
    	
    	i=0;
    	for(;i<200;i++)
    	{
    		if(num[i]!=0)
    		break;        
    	}
    	
    	for(;i<200;i++)
    	printf("%d",num[i]);
    
    }

    总结

    发现小位进位只能进1,好像还能更简单点,以后优化一下,高精度乘法好像更难点。

    展开全文
  • c语言精度乘法

    2020-12-03 21:18:36
    1.输入两个乘数,并定义后面需要到的变量 #include <stdio.h> #include <string.h> int main(void) { char a[100],b[100]; scanf("%s %s",&a,&b); int af[100],bf[100];

    高精度乘法

    众所周知,由于整型数不能满足过大数的运算,所以,在进行过大数的乘法运算时需要运用一种新的方法------高精度乘法。
    下面我将介绍大数相乘的几个步骤。

    1.输入两个乘数,并定义后面需要到的变量

    
    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        char a[100],b[100];
        scanf("%s %s",&a,&b);
        int af[100],bf[100];
    	int x=strlen(a);
    	int y=strlen(b)
    

    2.将字符数组中的数转移到整型数组中

    	for(int i=0;i<x;i++)
    	{
    		af[i]=a[x-i-1]-'0';
    		bf[i]=b[x-i-1]-'0';
    	 }
    

    3.我们再声明一个数组c来储存答案。大家通过一个简单的乘法运算进行模拟就可以看出,以同样的储存规则,a[0] * b[0] = c[0]; a[0] * b[1] + a[1] * b[0] = c[1];逐渐我们可以发现规律: "c[i + j] += a[i] * b[j]"同过一个循环去实现,就可以把c[i + j]计算出来。

     for(int i=0;i<x;i++)
    	 {
    	 	for(int j=0;j<y;j++)
    	 	{
    	 		c[i+j]=c[i+j]+af[i]*bf[j];
    		 }
    	 }
    

    4.把c中的每一个都进位,最后输出。

    	 int num=0;
    	 int t;
    	 while(c[t]!=0)
    	 {
    	 	t++;
    	 }
    	 for(int i=0;i<t;i++)
    	 {
    	 	num=c[i]+num;
    	 	if(num>=10)
    	 	{
    	 		c[i]=num%10;
    	 		num=num/10;
    		 }
    		 else
    		 {
    		 	c[i]=num;
    		 	num=0;
    		 }
    		 
    	 }
    	 if(num!=0)
    	 {
    	 	c[t]=num;
    	 		for(int i=t;i>=0;i--)
    	 	{
    	 		printf("%d",c[i]);
    		 }
    	 }
    	 else
    	 {
    	 	for(int i=t-1;i>=0;i--)
    	 	{
    	 		printf("%d",c[i]);
    		 }
    	 }
    	 
    	 return 0;
    }
    
    展开全文
  • C语言精度加法

    2020-06-28 17:44:27
     输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 算法描述  由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。  定义一个数组A,A[0]用于存储a的...

    问题描述
      输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

    算法描述
      由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
      定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
      计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
      最后将C输出即可。

    #include<stdio.h>
    #include<string.h>
    int main(){
    	int c[1000000],A[10100],B[10100],r=0;
    	int i,j,len1,len2;
    	char a[10100],b[10100];
    	gets(a);
    	gets(b);
    	len1=strlen(a);
    	len2=strlen(b);
    	for(i=len1-1,j=0;i!=-1;i--,j++){
    		A[j]=a[i]-'0';
    	}
        for(i=len2-1,j=0;i!=-1;i--,j++){
    		B[j]=b[i]-'0';
    	}
    	if(len1>=len2){
    		for(i=len2;i<len1;i++)
    		{B[i]=0;}
    	for(i=0;i<len1;i++)
    	{c[i]=(A[i]+B[i]+r)%10;
    	 r=(A[i]+B[i]+r)/10;
    	}
    	for(i=len1-1;i!=-1;i--)
    	printf("%d",c[i]);
    	}
    	else {
    		for(i=len1;i<len2;i++)
    		{A[i]=0;
    		}
    		for(i=0;i<len2;i++)
    	{c[i]=(A[i]+B[i]+r)%10;
    	r=(A[i]+B[i]+r)/10;
    	}
    	for(i=len2-1;i!=-1;i--)
    	printf("%d",c[i]);
    	}
    	
    } 
    
    展开全文
  • C语言精度算法

    万次阅读 多人点赞 2014-08-18 12:30:07
    笔者笔者去年总结了Pascal里有关高精度计算的问题,首先高精度计算可以解决以下四个问题:    1. 加数,减数,运算结果的输入和存储:  运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来...
  • 蓝桥杯–c语言精度加法问题 问题描述 输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理...
  • 输入形式】 从文件sigma.in中顺序读入4个由空格分隔的正整数k、x、m、n。(1≤ k、x、m、n ≤ 100)。 【输出形式】 将结果写到标准输出,其中小数占14位,不足部分补零,最后输出一个回车。(输入数据...
  • 输入形式】 输入文件为当前目录下的factor.in。该文件只包含一个正整数,表示需要求该正整数的阶乘。 【输出形式】 输入文件为当前目录下的factor.in。该文件只包含一个正整数,表示需要求该正整数的...
  • 注意宽度输出和精度输出控制scanf():从标准输入设备(键盘)读取数据,并将值存放在变量中。1、格式说明符个数与输入数据个数不相等的情况:当我们从键盘输入数据时,数据之间必须用分隔符分开(空...
  • 学习了《C语言printf()和puts()的简单使用》,大家应该能够使用 printf() 输出简单格式的数据了,%d、%f、%c 和 %s 只是 printf( ) 的格式控制字符串中转化字符的最简形式,printf() 格式控制字符串的完整形式为:%...
  • C语言输入输出函数

    2016-07-05 14:05:32
    (一)、输出格式:整型和短整型:%d 长整形:%ld 浮点型:%f 双精度型:%lf 输出地址:%p 换行:\r、\n (二)、printf的行缓冲: 1、int main() {  printf("hello world");  while(1); } 上面的程序并不...
  • C语言中用scanf输入精度浮点数

    千次阅读 2011-11-19 16:33:45
    %f是但进度浮点数的格式双精度浮点数应用%lf,改一下就行了 因为double是8个字节的,float是4个字节的,%f 的格式就是4个字节的,而 %lf 就是8个字节的#include #include int main( void ){ double x; scanf("%lf...
  • 精度计算一、数据输入先将要计算的数据输入到内存中一般是按位存到数组中,按位对齐。定义:第一位表示个位,n表示最高位。1、利用字符串输入:先以字符串方式输入,再存入数组。对非法输入可以作检查,处理小数...
  • 用户输入两个任意长度的数字,程序能够算出二者之和,利用c语言实现了高精度
  • C语言输入输出

    2019-02-21 21:49:29
    %lf:输入精度浮点数 %c:输入字符 %s:输入字符串 字符串的输入需用字符数组接收 gets:C语言中字符数组可用的输入 char a[100]; gets(a); getchar:逐个读取寄存器中的每一个字符直到遇到结束符号 输出函数 pr...
  • C语言 · 高精度加法

    2017-03-26 16:28:00
    算法提高 高精度加法 时间限制:1.0s 内存限制:256.0MB 问题描述  在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263。要想计算更加规模的...
  • C语言 · 高精度乘法

    2017-01-26 22:23:00
    算法提高 高精度乘法 时间限制:1.0s 内存限制:256.0MB 问题描述  在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263。要想计算更加规模的...
  • 1.问题引出:问题 E: 例题3-5 求一元二次方程的根 ...以空格分隔的一元二次方程的三个系数,双精度double类型 输出 分行输出两个根如下(注意末尾的换行): r1=第一个根 r2=第二个根 结果输出时,宽
  • C语言)高精度减法

    千次阅读 2017-04-22 21:08:18
    和高精度加法类似,高精度减法也需要使用数组来处理大数相减的问题。  输入 有多组测试数据。 对每组测试数据,在一行中给出两个正整数a,b。(a,b的位数小于1000),中间用一个空格隔开。 遇到文件结尾时输入...
  • 代码如下: #include<stdio.h> #include<string.h> void plus(char *a,char *b,char *c);... printf("请输入算式:"); scanf("%s %s %s",a,s,b); if(s[0]=='+') plus(a,b,c); printf("运算结果为:
  • C语言)高精度阶乘

    千次阅读 2017-04-22 21:43:30
    题目描述 启明星软件组组长听说我们会乘法之后,立马让我们帮他算一下阶乘(怎么有这么坏的组长)。 此题也很简单只需要算一下不大于100的数n的阶乘就好了,看我多好数据一下子少了10倍哦!...对于每组输入,在
  • # include # include int main() { int Add(char a[], char b[], char sum[]);//定义大数相加函数 void print(char sum[], int result_len);//定义输出函数 ...//以字符方式输入两个大数; int le
  • C语言)高精度乘法

    千次阅读 2017-04-22 21:22:43
    题目描述 这道题很简单,只需要计算a*b即可,唯一有点麻烦的就是a和b...输入 输入有多组数据。 对于每组测试数据,在一行中给出两个整数a,b(a,b的位数小于等于1000),中间用一个空格隔开。 保证输入没有前导0;
  • C语言)高精度除法

    千次阅读 2017-04-22 21:54:03
    精度除法:给定一个很大很大的数字,用它来除以一个 int 或 long 范围内的整数。  输入 输入包括多组测试数据。 对每组测试数据,在一行中给出一个整数N(0 输出 对每组输入数据, 在一行中...
  • C语言基本输入输出

    2019-03-04 11:00:49
    C 语言基本的输入输出 printf(): 转换说明: %c: 单个字符 %d:有符号十进制整数 %i:有符号十进制整数(同%d) %u:无符号十进制整数 %p:指针 %s:字符串 %f:浮点数,十进制计数法 %e:浮点数,e计数法 %%:...
  • 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1。 输入正整数N,输出计算结果S。 输入 一个正整数N。 输出 计算结果S。 样例输入 5 样例输出 153 解题思路:思考如何计算阶乘,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 733
精华内容 293
关键字:

c语言输入精度

c语言 订阅