zzuli 1627大整数减法
2012-04-24 20:31
218 查看
大整数减法
Time Limit:1000MS Memory Limit:65536K
Total Submit:43 Accepted:14
Description
求两个不超过200 位的非负整数的差。
Input
首先输入一个整数n , 表示测试实例的个数。
每组实例输入两行,每行是一个不超过200 位的非负整数,没有多余的前导0。
Output
每组实例输出一行,即相减后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能
输出为0342。
Sample Input
Sample Output
Hint
结果可能为负数
//////////////
思想:
0000000
123
//逆置
0000000
321
//补加0
0000000
3210000
//逆置回来(做比较)
0000000
0000123
//逆置(存储)
0000123
0000000
//作差
0000123
//去掉前导0
123
////////////////
#include<stdio.h>
#include<string.h>
#define max 210
char s1[max],s2[max];
int a[max],b[max];
void clear()//进行初始化
{
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
int mmax(int x,int y)
{
return x>y?x:y;
}
int main()
{
int i,j,t,f,l1,l2,l;
scanf("%d",&t);
while(t--)
{
clear();
scanf("%s%s",s1,s2);
l1=strlen(s1);
l2=strlen(s2);
l=mmax(l1,l2);
strrev(s1);//逆置
strrev(s2);//逆置
if(l1<l)//补加0
{
for(i=l1;i<l;i++)
s1[i]='0';
s1[i]='\0';
}
else//补加0
{
for(i=l2;i<l;i++)
s2[i]='0';
s2[i]='\0';
}
strrev(s1);//逆置回来(做比较)
strrev(s2);//逆置回来(做比较)
if(strcmp(s1,s2)>0)//(做比较)
f=1;
else if(strcmp(s1,s2)==0)
{
printf("0\n");
continue;
}
else
f=0;
strrev(s1);//逆置(存储)
strrev(s2);//逆置(存储)
if(f)
{
for(i=0;i<l1;i++)
a[i]=s1[i]-'0';
for(i=0;i<l2;i++)
b[i]=s2[i]-'0';
}
else
{
printf("-");
for(i=0;i<l1;i++)
b[i]=s1[i]-'0';
for(i=0;i<l2;i++)
a[i]=s2[i]-'0';
}
for(i=0;i<205;i++)
{
a[i]=a[i]-b[i];
if(a[i]<0)
{
a[i]=a[i]+10;
a[i+1]--;
}
}
for(i=201;i>=0;i--)//去掉前导0
if(a[i]!=0)
break;
for(j=i;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
return 0;
}
Time Limit:1000MS Memory Limit:65536K
Total Submit:43 Accepted:14
Description
求两个不超过200 位的非负整数的差。
Input
首先输入一个整数n , 表示测试实例的个数。
每组实例输入两行,每行是一个不超过200 位的非负整数,没有多余的前导0。
Output
每组实例输出一行,即相减后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能
输出为0342。
Sample Input
1 33333333333333333333 22222222222222222222
Sample Output
11111111111111111111
Hint
结果可能为负数
//////////////
思想:
0000000
123
//逆置
0000000
321
//补加0
0000000
3210000
//逆置回来(做比较)
0000000
0000123
//逆置(存储)
0000123
0000000
//作差
0000123
//去掉前导0
123
////////////////
#include<stdio.h>
#include<string.h>
#define max 210
char s1[max],s2[max];
int a[max],b[max];
void clear()//进行初始化
{
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
int mmax(int x,int y)
{
return x>y?x:y;
}
int main()
{
int i,j,t,f,l1,l2,l;
scanf("%d",&t);
while(t--)
{
clear();
scanf("%s%s",s1,s2);
l1=strlen(s1);
l2=strlen(s2);
l=mmax(l1,l2);
strrev(s1);//逆置
strrev(s2);//逆置
if(l1<l)//补加0
{
for(i=l1;i<l;i++)
s1[i]='0';
s1[i]='\0';
}
else//补加0
{
for(i=l2;i<l;i++)
s2[i]='0';
s2[i]='\0';
}
strrev(s1);//逆置回来(做比较)
strrev(s2);//逆置回来(做比较)
if(strcmp(s1,s2)>0)//(做比较)
f=1;
else if(strcmp(s1,s2)==0)
{
printf("0\n");
continue;
}
else
f=0;
strrev(s1);//逆置(存储)
strrev(s2);//逆置(存储)
if(f)
{
for(i=0;i<l1;i++)
a[i]=s1[i]-'0';
for(i=0;i<l2;i++)
b[i]=s2[i]-'0';
}
else
{
printf("-");
for(i=0;i<l1;i++)
b[i]=s1[i]-'0';
for(i=0;i<l2;i++)
a[i]=s2[i]-'0';
}
for(i=0;i<205;i++)
{
a[i]=a[i]-b[i];
if(a[i]<0)
{
a[i]=a[i]+10;
a[i+1]--;
}
}
for(i=201;i>=0;i--)//去掉前导0
if(a[i]!=0)
break;
for(j=i;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
return 0;
}
相关文章推荐
- noi-1738-大整数减法
- 大整数运算之 大整数加法、减法、乘法
- 华为机试题——整数减法
- 11:大整数减法[模版]
- 大整数-减法
- 11:大整数减法
- 实现整数的乘法、减法和除法运算,只允许使用加号
- C/C++程序算法小练习--大整数减法
- 大整数运算之 大整数加法、减法、乘法
- 大整数的加法、减法和乘法
- 大整数的减法
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 程序员面试金典: 9.7位操作 7.4只用加号实现整数的乘法、减法和除法运算
- 贪心算法-大整数乘法/加法/减法
- 大整数加法减法
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 大整数减法 (与后来做的高精度减法不同是用了容器)
- 大整数减法模板
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 大整数减法