高精度运算(大数)

求模(mod):直接在草稿纸上用小学方法算除法就能看出来

 1 #include<stdio.h>
 2 #include<string.h>
 3 char m[1010];
 4 int main(){int n,temp;
 5     while(~scanf("%s %d",m,&n)){temp=0;
 6         for(int i=0;i<strlen(m);++i){
 7             temp=temp*10+m[i]-‘0‘;
 8             temp%=n;
 9         }
10         printf("%d\n",temp);
11     }
12     return 0;
13 }

大数阶乘:模板。。。。理解就好。。。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 100010
 4 int a[N];
 5 int main()
 6 {
 7     int i,j,m;
 8     scanf("%d",&m);
 9     memset(a,0,sizeof(a));
10     a[0]=1;
11     for(i=2;i<=m;i++)
12     {
13         int c=0;
14         for(j=0;j<N;j++)
15         {
16             int s=a[j]*i+c;
17             a[j]=s%10;
18             c=s/10;
19         }
20     }
21     for(j=N-1;j>=0;j--)
22     {
23         if(a[j])
24         break;
25     }
26     for(i=j;i>=0;i--)
27     {
28         printf("%d",a[i]);
29     }
30     printf("\n");
31     return 0;
32 }

大数相乘:自己敲的可能有些麻烦:

 1 #include<stdio.h>
 2 #include<string.h>
 3 char a[201],b[201];
 4 char c[500];
 5 int bignum(){
 6 int x[201],y[201],t1,t2,t,i,j,z[500];
 7 memset(z,0,sizeof(z));
 8 t1=strlen(a);t2=strlen(b);
 9 for(i=t1-1,j=0;i>=0;--i,j++)x[j]=a[i]-‘0‘;
10 for(i=t2-1,j=0;i>=0;--i,j++)y[j]=b[i]-‘0‘;
11 for(i=0;i<t1;i++){
12 for(j=0;j<t2;j++){
13 z[j+i]=z[j+i]+x[i]*y[j];
14 t=i+j;
15 }
16 }
17 for(i=0;i<=t;i++){
18 if(z[i]>10)z[i+1]+=z[i]/10,z[i]%=10;
19 if(i==t&&z[t+1])t++;
20 }
21 for(i=t,j=0;i>=0;--i,++j)c[j]=z[i]+‘0‘;
22 c[j]=‘\0‘;
23 }
24 int main(){
25 int T;
26 scanf("%d",&T);
27 while(T--){
28 scanf("%s%s",a,b);
29 bignum();
30 printf("%s\n",c);
31 }
32 return 0;}

大数相加:hd1047:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX(x,y) x>y?x:y
 4 char c[1010];
 5 void bigsum(char *a,char *b){
 6     int x[1010],y[1010],z[1010],t1,t2,t,i,j;
 7     memset(x,0,sizeof(x));
 8     memset(y,0,sizeof(y));
 9     memset(z,0,sizeof(z));
10     t1=strlen(a),t2=strlen(b);
11     t=MAX(t1,t2);
12     for(i=t1-1,j=0;i>=0;j++,i--)x[j]=a[i]-‘0‘;
13     for(i=t2-1,j=0;i>=0;j++,i--)y[j]=b[i]-‘0‘;
14     for(i=0;i<t;++i){
15         z[i]=x[i]+y[i]+z[i];
16         if(z[i]>9)z[i]-=10,z[i+1]++;
17         if(i==t-1&&z[t])t++;
18     }
19     for(i=t-1;i>0;i--)if(z[i])break;
20     for(j=0;i>=0;i--,j++){
21         c[j]=z[i]+‘0‘;
22     }
23     c[j]=‘\0‘;
24 }
25 int main(){
26     int T,flot=0,N;
27     char a[1010];
28     scanf("%d",&N);
29     while(N--){memset(c,0,sizeof(c));
30         while(scanf("%s",a)){
31             bigsum(a,c);
32             if(!strcmp(a,"0"))break;
33         }
34         printf("%s\n",c);
35         if(N)puts("");
36     }
37     return 0;
38 }
时间: 2024-10-13 11:42:29

高精度运算(大数)的相关文章

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

大数高精度运算(模板)

前言:高精度运算.是指參与运算的数(加数.减数,因子--)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算. 模板:包含大数加减乘除.大数与int数的乘法,模板能够不断扩充. 代码: /* 所有亲測可用,可是不能用于负数的运算,仅仅能对正数进行大数运算 */ const int ten[4]= {1,10,100,1000}; const int maxl = 300; struct BigNumber { int d[maxl]; char s[maxl]; BigNumber(co

[入门]高精度运算

(本人知识 while(1)cout<<"非常"; 有限,如果你看到我有任何错漏或者不足,真的真的真的恳请大家指出,蟹蟹,我希望大家可以一起进步~) int类型的变量只能存放-2^31~2^31-1范围的数据 long long类型的变量只能存放-2^63~2^63-1范围的数据 对于大数阶乘这种肯定是存不下,因此我们需要用数组存放数据: 下面是一个高精度运算的例子: 题目描述 用高精度计算出S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤5

高精度运算

在开发中高精度运算使用并非非常频繁,float和double的精度实际上能够满足绝大多数需要,且高精度运算效率比常规的运算要慢一点,但使用高精度运算往往是为了使用其中便捷的API.官方提供的高精度运算的类主要两个 BigInteger:当数值范围超过long时使用 BigDecimal:几乎涵盖BigInteger功能,还可以保留小数点任意位数,理论上精度无穷大,以下主要说明此类 注:两者API很相似 加减乘除 BigDecimal aaa = new BigDecimal(20); BigDe

高精度运算1

1.高精度运算_加法 AYYZOJ p1443 COGS p37 1 type 2 arr=array[1..200]of integer; 3 var 4 a,b:arr;i,la,lb:integer; n:string; 5 procedure add(a,b:arr;la,lb:integer); 6 var i,x,lc:integer; c:arr; 7 begin 8 i:=1; x:=0; 9 while (i<=la) or(i<=lb) do 10 begin x:=a[i

高精度运算专题3-乘法运算(The multiplication operation)

这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面 函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了. ①记录数组a.数组b的长度,放到第一位 ②每个位相乘,用一个数来记录进位(初值为0),每个位相乘,加上进位,存入c数组的相对应的位置,每次进位要重新赋值 ③最后记得要

高精度之大数乘小数

今天下载百度文库资料时发现了 发现了内蒙古电子信息学院的ACM模板. 打开看了一下刚开始就是高精度的计算问题. 于是我就写了写.说实话在我的心里对这些东西有点抵触.因为接触的时候没能很好的掌握所以以后遇到这样的问题总是逃避,虽然逼着自己也能写出来,但是就是不愿意去写. 今天看到一个人的博客让我受益很深.其实不是内容,当然内容也很好.让我感觉到,其实厉害的人不是有多大的成就,会多少别人听都没听过的知识,把一件小事情做好,做的自己满意这就是成功. 闲话不扯了,我们来说一下高精度乘法问题. 大数乘小数

整数高精度运算——加法

高精度运算是信息学的一种重要算法.这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法.也是一些信息学竞赛的常考题目. 高精度运算主要有以下几个步骤: 1.读取字符串,转换成数字倒序存储到整数数组中: 2.运算,注意进位和借位: 3.倒序输出整数数组,加法注意最高位进位,减法注意高位中的无用的0不要输出: 高精度加法代码: #include<stdio.h>#include<string.h>char s[1000];       //数组比较大时,应作

算法学习笔记(三)问题的转化与高精度运算

问题:设购票点没有任何的零钱,票价50美元,现有m人手持50美元,n人手持100美元,求这样m+n个人构成的队伍有多少种排队方法可以使得整个售票过程不中断. 分析:对于这个问题,经过简单的模拟可以发现,每个手持100的前面必须有一个手持50的,同样如果有k个手持100的连续出现,则前面至少连续k次50. 这样一来,可以设手持50元的为+1,手持100元的为-1,设ai为为第i个人所对应的值,则问题转化为数组的部分和a1+a2+...+ak≥0,其中k≤m+n,为了求这样的数列的个数,需要使用组合

高精度之大数乘大数

上一篇说了简单的大数乘以小数的问题,绝大多数的问题解决不了. 现在我们来说一下大数乘以大数. 大数乘以大数也是用来模拟手算. 举个例子吧! 先从个位开始一个一个的乘 乘完个位然后再乘十位,乘十位的时候要和个位的想成的结果相加. 这里注意乘十位的时候 就不要和乘个位数字的结果中的最后一位相加了 .就是如图搓位. 就是这样 . 下面先贴上我的代码. #include<iostream> #include<string.h> using namespace std; void mult(