大数分类

大数  加法.txt

#include<iostream>

#include<string.h>

#include<string>

#include<algorithm>

using namespace std;

chara[1001],b[1001];

int c[1001],d[1001];

intlen1,len2;        // 注意给整形数组赋初值

int main()

{

inti,j,n;

cin>>n;

inte=0;

 

while(n--)

{

e++;

 

memset(c,0,sizeof(c));

memset(d,0,sizeof(d));

 

cin>>a>>b;      len1=strlen(a);len2=strlen(b);

intmax1;

 

for(i=len1-1,j=0;i>=0;i--)

c[j++]=a[i]-'0'; //字符型转化为整形

                    //for(i=0;i<=len1-1;i++)

//                cout<<c[i];

for(i=len2-1,j=0;i>=0;i--)

d[j++]=b[i]-'0';

max1=max(len1,len2);

/*if(len1<len2)      作用是将两个不同长度的数 倒置之后 后面的空位数变为0

{

i=len1-1;

while(i++&&i!=len2)

c[i]=0;

}

else

{

i=len2-1;

while(i++&&i!=len1)

d[i]=0;

}*/

 

for(i=0;i<=max1-1;i++)

{

c[i]+=d[i];

if(c[i]>=10)

{

c[i]-=10;

c[i+1]++;

}

}

cout<<"Case"<<e<<":"<<endl<<a<<" +"<<b<<" = ";

for(i=max1;i>=0;i--)

{

if(!c[i]&&i==max1)

continue;

cout<<c[i];

}

cout<<endl;

if(n!=0)

cout<<endl;

 

/*        if(c[max1-1]>10)

{

c[max1-1]-=10;

c[max1]++;

}

for(i=0;i<=max1;i++)

{

if(c[max1]!=1)

break;

cout<<c[i];

}

*/

}

 

 

/*

for(i=len2-1,j=0;i>=0;i--)

b[j++]=s2[i]-'0';

for(i=0;i<=max1;i++)

{

a[i]+=b[i];

if(a[i]>10)

{

a[i]-=10;

a[i+1]++;

}

}

if(a[max1-1]>10)

{

a[max1-1]-=10;

a[max1]++;

}

i=max1;

while(!a[i--])

;

while(i--)

cout<<a[i];

*/

}

 

/*

int main()

{

inti;

chara[1000],b[1000];

intn;

cin>>n;

for(i=1;i<=n;i++)

{

cin>>a>>b;

add(a,b);

cout<<endl;

}

return0;

}

*/


51nod  大数相加

(详尽解释版)

 

#include<iostream>

#include<ctype.h>

#include<cstdio>

 

#include<algorithm>

using namespace std;

#include<cstring>

#include<string.h>

 

 

charA[10005],B[10005],res[10005];

 

int cmp(char *a,char*b)

{

intlena=strlen(a);

intlenb=strlen(b);

if(lena!=lenb)             //如果 a的长度不等与b的长度   返回a《b为真      如果a》b返回假

returnlena<lenb;

for(int i=0;i<lena;i++)     //如果a的长度==b的长度  紧接着比较每个字符的大小 返回 a[i]<b[i]为真  如果a[i]》b[i]返回假

if(a[i]!=b[i])

returna[i]<b[i];

return 0;

}

 

voidadd(char *a,char *b)           // 相加时不明大小

{

intlena=strlen(a);

intlenb=strlen(b);

if(lena>lenb)                       //两个正数相加   确定某一个长度一直为最大长度 方便一次性计算

swap(a,b),swap(lena,lenb);

 

reverse(a,a+lena);

reverse(b,b+lenb);

 

intlen=lenb;

for(int i=lena;i<len;i++)           // len=lenb    这个最大的定值就是上面 所说的方便一次性计算的意思

a[i]='0';                   //  将两个串的长度一致  因此需要对 短的字符串后面填‘0’;

 

intc=0;

for(int i=0;i<len;i++)              //大数相加

{

intt=(a[i]-'0')+(b[i]-'0')+c;

c=(t>=10);

res[i]=(t-10*c)+'0';  //  因为前一部分是数字 需加‘0’

}

if(c)

res[len++]='1';                 //最后一位数

res[len]='\0';              //终止条件

reverse(res,res+len);           //再转置

}

 

voidjian(char *a,char *b)   //知道大小    a大与b   1.a的位数大与b   2.位数相等并且a》b

{

intlena=strlen(a);

intlenb=strlen(b);

 

reverse(a,a+lena);          //转置

reverse(b,b+lenb);

 

int len=lena;               //最长的赋给一个变量

 

for(int i=lenb;i<len;i++)     //对短的进行填‘0’

b[i]='0';

 

intc=0;

for(int i=0;i<len;i++)      //大数减法

{

intt=(a[i]-'0')-(b[i]-'0')-c;

c=(t<0);

res[i]=t+10*c+'0';

}

res[len]='\0';     //终止符

 

while(len>1&&res[len-1]=='0')       //大数减法的一个特殊判定条件

res[--len]='\0';

reverse(res,res+len);

}

 

 

int main()

{

cin>>A>>B;

 

bool isa=isdigit(A[0]);   //判断正负  如果为正返回真  为负返回假

                 boolisb=isdigit(B[0]);

if(isa)                 //如果大数A是正数

{

if(isb)                // 并且 大数B为正数

add(A,B);          //  则符合第一个情况                《正正《正数相加》大加小/小加大》

else

{

if(cmp( A , B + 1 ))    //条件为真说明B+1大于A  《正负《正负相加==正负号(同最大的)(大的减小的)》正负号(同最大的)(大减小)》

{                       //而此处的判断 是判断负的大  意思是b+1>a

cout<<"-";

jian(B+1,A);            //传值的时候非常巧  先传大的再传小的

}

else           //否则就是A>B

jian(A,B+1);       //先传大的再传小的

}

}

else

{

if(isb)    // a为负  并且b为正

{

if(cmp(A+1,B))     //判断 正值是否大于负值

jian(B,A+1);       //如果正值大于负值  直接进行相减   因为最后是一个正数  所以 直接套用正数减正数(大数减法)此处减少了许多麻烦

else

{

cout<<"-";      // 正值小于负值     因此最后答案是-的   因此多输出一个负值

jian(A+1,B);       //大数减法

}

}

else

{

cout<<"-";      //都为负的  直接输出-

                                 add(A+1,B+1);   //-值+ -值得到的结果是两个负值相加  因此调用大数加法

}

}

cout<<res<<endl;    //输出最后的字符串

return0;

}





超级大数除法

问题描述:

求两个大的正整数相除的商

输入数据

第 1 行是测试数据的组数n,每组测试数据占2 行,第1 行是被除数,第2 行是除数。

每组测试数据之间有一个空行,每行数据不超过100 个字符

输出要求

n 行,每组测试数据有一行输出是相应的整数商

输入样例

3

2405337312963373359009260457742057439230496493930355595797660791082739646

2987192585318701752584429931160870372907079248971095012509790550883793197894

10000000000000000000000000000000000000000

10000000000

5409656775097850895687056798068970934546546575676768678435435345

1

输出样例

0

1000000000000000000000000000000

5409656775097850895687056798068970934546546575676768678435435345

解题思路

基本的思想是反复做减法,看看从被除数里最多能减去多少个除数,商就是多少。一个

一个减显然太慢,如何减得更快一些呢?以7546 除以23 为例来看一下:开始商为0。先减

去23 的100 倍,就是2300,发现够减3 次,余下646。于是商的值就增加300。然后用646

减去230,发现够减2 次,余下186,于是商的值增加20。最后用186减去23,够减8 次,

因此最终商就是328。

所以本题的核心是要写一个大整数的减法函数,然后反复调用该函数进行减法操作。

计算除数的10 倍、100 倍的时候,不用做乘法,直接在除数后面补0 即可。

 

来自<http://www.cnblogs.com/c840136/articles/2168405.html>




C++substr函数的用法

#include<string>

#include<iostream>

using namespace std;

main()

{

string s("12345asdf");

string a=s.substr(0,5);       //获得字符串s中 从第0位开始的长度为5的字符串//默认时的长度为从开始位置到尾

cout<<a<<endl;

}

输出结果为:

12345

 

来自<http://blog.csdn.net/no_retreats/article/details/7853066>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值