精华内容
下载资源
问答
  • C语言大数运算

    2019-10-05 17:31:34
    运算存入 36 { 37 for (j= 0 ;j(s2);j++ ) 38 c[i+j]+=a[i]*b[j]; // 重点 39 } 40 for (i= 0 ;i;i++ ) 41 { 42 c[i+ 1 ]=c[i+ 1 ]+c[i]/ 10 ; 43 c[i]=c[i]% 10 ; 44 } 45 for ...
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #define max 100//数字位数
     5 void add(char *s1,char *s2)//两位大于0的数字加法
     6 {
     7     int mun1[max+1]={0},mun2[max+1]={0},m,n,i=0,j=0;
     8     m=strlen(s1)-1;
     9     n=strlen(s2)-1;
    10     for (i=0;m>=0;m--)//将字符串1转换为数字,并反序存入
    11         mun1[i++]=s1[m]-'0';
    12     for (j=0;n>=0;n--)//将字符串2转换为数字,并反序存入
    13         mun2[j++]=s2[n]-'0';
    14     for (i=0;(i<=strlen(s1)-1)|| (i<=strlen(s2)-1) ;i++)//运算
    15     {
    16         mun1[i+1]+=(mun1[i]+mun2[i])/10;
    17         mun1[i]=(mun1[i]+mun2[i])%10;
    18     }
    19     for (i=max;(i>=0)&&(mun1[i]==0);i--);//定位第一个不等于0的数
    20     for (;i>=0;i--)//输出答案
    21     {
    22         printf("%d",mun1[i]);
    23     }
    24     printf("\n");
    25 }
    26 void mul(char *s1,char *s2)//大于0的两位数乘法
    27 {
    28     int a[max]={0},b[max]={0},c[max+1]={0},i=0,j=0,m,n;
    29     m=strlen(s1)-1;
    30     n=strlen(s2)-1;
    31     for (i=0;m>=0;m--)//将字符串1转换为数字,并反序存入
    32         a[i++]=s1[m]-'0';
    33     for (j=0;n>=0;n--)//将字符串2转换为数字,并反序存入
    34         b[j++]=s2[n]-'0';
    35     for (i=0;i<strlen(s1);i++)//运算存入
    36     {
    37         for (j=0;j<strlen(s2);j++)
    38             c[i+j]+=a[i]*b[j];//重点
    39     }
    40     for (i=0;i<=max;i++)
    41     {
    42         c[i+1]=c[i+1]+c[i]/10;
    43         c[i]=c[i]%10;
    44     }
    45     for (i=max;i>=0 && c[i]==0;i--);
    46     for (;i>=0;i--)
    47     {
    48         printf("%d",c[i]);
    49     }
    50     printf("\n");
    51 }
    52 int main()
    53 {
    54     char s1[max],s2[max];
    55     scanf("%s %s",s1,s2);
    56 
    57     mul(s1,s2);
    58     add(s1,s2);
    59     return 0;
    60 }

     

    转载于:https://www.cnblogs.com/sy-me/p/6746533.html

    展开全文
  • 大数运算-RSA-c语言大数运算

    热门讨论 2009-03-04 12:55:06
    大数运算 RSA c语言大数运算库 英文PDf 中文PDF 源码
  • C语言 大数运算(无限大小)头文件 支持 + , - , * , / , % ,> , ,>=,,==.流输入>>,流输出<<.
  • C语言大数运算-加法篇

    万次阅读 多人点赞 2017-04-03 14:31:17
    虽然大多主流的编程语言如java,c++,都有大数运算库,可是c语言标准库并没有提供的大数运算,网上的c语言大数运算大多散而不周或过于复杂,所以本人决定写博客做一些简单的介绍,由于本人水平有限,如有错误或者bug...

    前言:
    本篇博客将分为4到5篇来和大家一块讨论大数的加减乘除,然后再将运算做成一个大数运算库。其中除法较为棘手,但如果作完前三个运算后就没有什么难度了。虽然大多主流的编程语言如java,c++,都有大数运算库,可是c语言标准库并没有提供的大数运算,网上的c语言大数运算大多散而不周或过于复杂,所以本人决定写博客做一些简单的介绍,由于本人水平有限,如有错误或者bug请大家批评指正我会第一时间更正。

    开发环境:
    本人没有windows电脑,所有的编写测试都是在centos 3.10.-514.6.1.el7.x86_64 和 gcc 4.8.5 下做的,windows平台下没有任何测试,所以如果windows下出现错误我也无能为力。

    总体思路:
    加法和减法类似,乘法和除法类似,我们会先从大数加减法开始然后是乘除法。使用数组作为数据结构保存用户的输入和结果,主要就是将大数的整体运算转换为每一个数组元素的运算,难点也就在转换上。

    大数减法:
    假设 :
    用户输入的数据保存在数组adda与数组addb中,adda={1,2,3,4,5,6,7,8,9};addb={1,2,3,4}。如果模仿手工计算,从低位到高位以次先加,满十则进一,那么将会有两个问题要解决。

    问题:
    1.用数组保存结果那么结果的长度是多少位?
    2.如何写一个满十进一的算法。
    其实这两个问题也很简单:
    1.二个数相加结果最大只会比较大的数多一位,所以:用lensum代表结果的长度lena代表adda的长度,lenb代表addb的长度。
    lensum=lena>lenb?lena:lenb;
    lensum++;
    就可以确定结果数组的长度。
    2.如果每加一位就判断是否进一的话问题就会复杂一点,所以我们可以先保存每一位相加的结果然后在对结果进行处理如图。这里写图片描述
    一次性对result进行处理就很好实现:

    for(i=lensum-1;i>0;i--){    
        if(result[i]>9){
            result[i]=result[i]%10;
            result[i-1] += 1;
        }
    }

    注意实际的程序,会把9+4的结果存在result[0]中,8+3的结果存在result[1]中,上面的图是为了简化方便理解,其实也可以像图中那样存把循环控制的i由递增改成递减就可以了。

    实现:
    我会将加法写成方法,然后在main函数中调用,这样方便以后做成一个自己的库,代码很完整注释也很多。很好懂的。

    1 //#include"big.h"
      2 //将整个加法写成一个方法,然后在main函数中调用。
      3 #include<stdlib.h>
      4 #include<stdio.h>
      5 #include<string.h>
      6 char * bigadd(char *adda,int lena,char *addb,int lenb){     //加法运算的方法。
      7   int num='0',i,k,j,tmp;
      8   for(i=0;i<lena;i++){                                      //将字符编码的数字转换为对应的数,
      9       adda[i]=adda[i]-num;                                  //例如6实际在字符串中存储的是54,
     10   }                                                         //减去0对应的48得到真实的6存储在字符数组中。
     11   for(i=0;i<lenb;i++){
     12       addb[i]=addb[i]-num;
     13   }
     14     int lensum;                                             //求出结果数组的长度。
     15     lensum = lena>lenb?lena:lenb;
     16     lensum++;
     17     char *result,final[BUFSIZ];                             //result用于返回结果集,final数组用于整理结果集。
     18     result=(char*)calloc(lensum,1);
     19     for(i=0,j=0;i<lena&&j<lenb;i++,j++){                    //循环的给每一位作加法
     20       result[i]=adda[lena-i-1]+addb[lenb-i-1];
     21     }
     22     if(lena>lenb){                                          //使用判断将较大数的高位也写入结果数组
     23       for(i=lenb;i<lena;i++){
     24          result[i]=adda[lena-i-1];
     25       }
     26     }
     27     if(lenb>lena){
     28       for(i=lena;i<lenb;i++){
     29          result[i]=addb[lenb-i-1];
     30       }
     31     }
     32     for(k=0;k<lensum-1;k++){                                //整理结果数组的每一位,满10进一。
     33       if(result[k]>9){
     34          tmp=result[k]/10;
     35          result[k]=result[k]%10;
     36          result[k+1] += tmp;
     37       }
     38     }
     39    j=0;
     40    if(result[lensum-1]!=0){                                 //去掉前前导0将结果处理后写到final数组中。
     41       final[j]=result[lensum-1]+'0';
           j++;
     43    }
     44    for(i=lensum-2;i>=0;i--){
     45       final[j++]=result[i]+'0';
     46    }
     47    result=final;                                            //再把result指针指向final数组中,并返回result指针。    
     48    return result;
     49 }
     50 int main(){                                                 //利用main测试方法,用puts打印结果。               
     51    int lena,lenb;
     52    char *result,sa[BUFSIZ],sb[BUFSIZ];
     53    scanf("%s",sa);
     54    scanf("%s",sb);
     55    lena=strlen(sa);
     56    lenb=strlen(sb);
     57    result=bigadd(sa,lena,sb,lenb);
     58    puts(result);
     59 
     60 }
    
    

    下篇介绍大数减法。

    展开全文
  • 关于c语言中的大数运算思想是怎么回事!关于c语言中的大数运算思想是怎么回事!关于c语言中的大数运算思想是怎么回事!关于c语言中的大数运算思想是怎么回事!关于c语言中的大数运算思想是怎么回事!关于c语言中的...
  • C语言大数运算-大数运算库篇

    千次阅读 2017-04-04 16:38:26
    big.h就是头文件只要将函数的声明放到该文件中,然后在其它程序中引用该文件就可以使用大数运算的方法。重复的代码我就不再写了,其实有了算法你们自己就可以实现,所以我就简单的说几句。文件命名: 头文件: b

    前言 :
    通过前面的3篇文章我们已经实现了大数的四则运算,本篇博客我们会把这是几个个方法做成一个库文件,可以供自己日后使用。细心的读者可能意到了,每个程序都引用了big.h但是都被注释掉了。big.h就是头文件只要将函数的声明放到该文件中,然后在其它程序中引用该文件就可以使用大数运算的方法。重复的代码我就不再写了,其实有了算法你们自己就可以实现,所以我就简单的说几句。

    文件命名:
    头文件: big.h 源码在本篇
    大数加法:big_add.c 完整源码在加法篇
    大数减法:big_sub.c 完整源码在减法篇
    大数乘法:big_mul.c 完整源码在乘除法篇
    大数除法:big_div.c 完整源码在乘除法篇
    测试文件:main.c 源码在本篇

    实现:
    1.将每个源码文件中的main函数去掉,将big.h注释取消。
    2.编写big.h代码如下。

      1 char * bigadd(char *adda,int lena,char *addb,int lenb);
      2 char * bigsub(char *suba,int lena,char *subb,int lenb);
      3 char * bigmul(char *m,int lena,char *f,int lenb);
      4 char * bigdiv(char *diva,int lena,char *divb,int lenb);

    3.编写一个测式的文件,代码如下。

      1 #include"big.h"
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #include<stdio.h>
      5    int lena,lenb;
      6    char *result;
      7    char sa[BUFSIZ],sb[BUFSIZ];
      8 void getdata(){
      9    scanf("%s",sa);
     10    scanf("%s",sb);
     11    lena=strlen(sa);
     12    lenb=strlen(sb);
     13 
     14 }
     15 void myadd(void){
     16    getdata();
     17    result=bigadd(sa,lena,sb,lenb);
     18    puts(result);
     19 }
     20 void mysub(void){
     21    getdata();
     22    result=bigsub(sa,lena,sb,lenb);
     23    puts(result);
     24 }
     25 void mymul(void){
     26    getdata();
     27    result=bigmul(sa,lena,sb,lenb);
     28    puts(result);
     29 }
     30 void mydiv(void){
     31    getdata();
     32    result=bigdiv(sa,lena,sb,lenb);
     33    puts(result);
     34 }
     35 
     36 int main(){
     37    myadd();
     38    mysub();
     39    mymul();
     40    mydiv();
     41    return 0;
     42 }

    编译和测试:

    gcc big_add.c big_sub.c big_mul.c big_div.h
    
    ./a.out

    C语言大数运算,参考了很多人的博客和代码,学到了很多,在这里表示感谢。这次对大数运算的小小总结也是希望可以帮到有需求的人,哪怕一点点。

    展开全文
  • 所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA 公开密码学、Diffie-Hellman密钥交换(Key Exchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(Elliptic ...
  • 还是大数运算,这次是乘法的。具体都写在代码里面了,就不多说。 /****************************************************************************************/ /* 大数运算篇——乘法 */ /*...

    还是大数运算,这次是乘法的。具体都写在代码里面了,就不多说。

    /****************************************************************************************/ 
    /*						大数运算篇——乘法   										    */ 
    /*          56             分析:两个数相乘,最多不超过10的(2+2)次方,即最多4位数2+2  */ 
    /*       X  44                   用乘数的每个数去乘被乘数,然后把同一列的数相加,即     */ 
    /*      20  24                   24+0=24  20 + 24 =44 20+0=20                           */ 
    /* 20   24                       然后,大于十的进十位数,24留4进2 44+2=46,留6进4,     */ 
    /* 20   44  24                   20+4=24留4进2 最后结果就是2464                         */ 
    /* 24    6   4                   可以发现一个规律,两个相乘的数,从右往左数第0位与第二  */ 
    /* 结果 2464                     个数第0位,乘出来相加的列是第0列,第1位与第2位乘在第3列*/ 
    /*                               得出结论:第a列的数与第b列的数字想乘得出来的结果是在   */ 
    /*                               第a+b列里面相加的  	                                */ 
    /****************************************************************************************/
    /*
    	具体问题:
    			1.如何存储与计算?      输入数据在字符数组中,计算的数据变到整型数组
    			2.上诉分析的6,是60,4是400,这里的处理?再转回字符数组
    			3.  
    //作者:fat pears 最近更新时间:2019.01.31 
    /*代码实现*/
    #include<stdio.h>
    #include<string.h>
    #define N 1000
    
    int main()
    {
    	char num_1[N]={0},num_2[N]={0},result[N]={0};          //num用来存放输入的数据,date用来计算 
    	int  date_1[N]={0},date_2[N]={0},date_3[N+N]={0};      //date_3是暂存计算结果 
    	int  i,j,t;
    	
    	printf("请输入第一个数:\n");
    	gets(num_1);
    	printf("请输入第二个数:\n");
    	gets(num_2);
    	
    	//倒序赋值,把num中的数赋值到date中 
    	for(i = 0;num_1[i]!='\0';i++)
    	{
    		date_1[strlen(num_1)-i-1] = num_1[i] - '0';
    	}
    	for(i = 0;num_2[i]!='\0';i++)
    	{
    		date_2[strlen(num_2)-i-1] = num_2[i] - '0';
    	}
    
    	//开始计算,遍历所有计算,按规律,第i个数与第j个数想乘结果是在第i+j中进行相加的 
    	for(i = 0;i<strlen(num_1);i++)
    	{
    		for(j = 0;j<strlen(num_2);j++)
    		{
    			date_3[i+j] += date_1[i] * date_2[j];
    		}
    	}
    	
    	//开始进位 从0开始,对10取余进商
    	for(i = 0;i<=strlen(num_1)-1+strlen(num_2)-1;i++)
    	{
    		date_3[i+1] += date_3[i]/10;
    		date_3[i]   =  date_3[i]%10; 
    	 }
    		
    	//把计算好的date_3数据放入字符数组
    	for(i = 0;i<=strlen(num_1)+strlen(num_2)-1;i++)
    	{
    		result[strlen(num_1)+strlen(num_2)-1-i] = date_3[i] + '0';
    	}
    
    	//删除前面多余0
    	for(i = 0;;i++)
    	{
    		if(result[i] != '0')
    		{
    			t = i;
    			break;
    		}
    	} 
    	for(;i<strlen(num_1)+strlen(num_2);i++)
    	{
    		result[i-t] = result[i];
    	}
    	result[i-t] = '\0';
    	
    	printf("两数相乘的结果是:\n");
    	puts(result);
    
    	
    	return 0; 
    	
    }
    
    展开全文
  • C语言大数运算——加法

    千次阅读 2019-01-30 19:28:15
    这个老到掉牙的大数运算问题,本人一个初学者,在这里发了给自己看吧—,如果可以帮助别人,我也是很开心的哈,不过我这表诉能力,emmm,废话不多说,上干货 123456 + 126 主要问题: 1.大数用什么存放? 2.两个大数...
  • 接着加法之后写了个减法,大数减法主要有几个问题 1.减完了后是负数怎么办? 2.减完了后有几位数? 3.减法的操作是如何进行的? /******************************.../* 大数运算篇——减法 */ /* 1...
  • C语言大数运算-减法篇

    万次阅读 2017-04-03 17:04:03
    与加法类似,还是将用户的输入和结果放入变长的数组中然后模仿手工运算从低位到高位依次相减,会有三个需要解决的问题,其中前二个和大数加法的问题很相似,所以就不再详细说明。问题: 1.结果最多有多少位? 2....
  • C语言大数运算-乘除法篇

    万次阅读 多人点赞 2017-04-04 00:53:42
    我会先介绍大数的乘法载介绍大数的除法,乘法的难点在于要使用一个嵌套循环,除法的难点在于一个字使用符串比较方法的技巧,本次还是会将算法都写成函数,然后在main()函数中调用,原因是在第四
  • 代码用途: 对较大的数据进行阶乘运算,如100等。 输入用例: 100
  • 代码用途: 对较大范围内的数据进行多次方运算 如:13的100次方;2的1000次方等。
  • } 思路: 用数学上的进位思想,先定一个长度为N的大数组,让数组的最后一个元素为1,例如要算13的1次方,就让数组的最后一个元素1乘于13,得到13,将个位数(即应该保存在这个数组空间的数,在这里是3)留下来,将...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 313
精华内容 125
关键字:

c语言大数运算

c语言 订阅