大数 加法.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>