比赛 |
防止浮躁的小练习v0.4 |
评测结果 |
C |
题目名称 |
增强的减法问题 |
最终得分 |
0 |
用户昵称 |
S_L |
运行时间 |
0.000 s |
代码语言 |
C |
内存使用 |
0.00 MiB |
提交时间 |
2016-10-13 21:05:54 |
显示代码纯文本
#include "stdio.h"
#include "string.h"
/************************************************************************/
/* 高精度减法 (这个函数要a[]>=b[]) */
/* a[]被减数数组,位数不限 */
/* b[]减数数组,位数不限 */
/* back[]结果数组,位数不会大于a[]数组的 */
/************************************************************************/
void sub(char a[],char b[],char back[])
{
int i,k,l1,l2;
l1=strlen(a);
l2=strlen(b);
back[l1]='/0';
for (i=l2-1,l1--;i>=0;l1--,i--) //减数的个数小于等于被减数,所以减的次数依减数而定
{
if (a[l1]-b[i]>=0) //不需要借位相减
{
back[l1]=a[l1]-b[i]+'0';
}
else //向前一位借1
{
back[l1]=10+a[l1]-b[i]+'0';
if (a[l1-1]!='0') //当前一位非0,可以被借时,直接借来
{
a[l1-1]-=1;
}
else //若前一位为0,则无法借到,继续向前一位的前一位借,循环
{
k=l1-1;
while (a[k]=='0')
{
a[k]='9'; //前一位的0,就变成了10,扣去被后一位借去的,还有9
k--;
}
a[k]-=1; //到达可以借的位置
}
}
}
while (l1>=0) //被减数多于减数的位数直接赋给结果数组
{
back[l1]=a[l1];
l1--;
}
while (back[0]=='0') //将结果数组往前移,方便以后的操作
{
l1=strlen(a);
for (i=0;i<l1-1;i++)
{
back[i]=back[i+1];
}
back[l1-1]='/0';
}
if (strlen(back)==0) //被减数与减数刚好相减为0的情况
{
back[0]='0';
back[1]='/0';
}
}
/************************************************************************/
/* 判断函数(被减数与减数的大小比较) */
/* 可以用strcmp函数比较字符串 */
/* 比较完后,若小于减数,则置换带入高精度减法函数,最后加'-'输出 */
/************************************************************************/
bool isBigger(char a[],char b[])
{
int l1,l2;
l1=strlen(a);
l2=strlen(b);
if (l1>l2)
{
return true;
}
else if (l1<l2)
{
return false;
}
else
{
if (strcmp(a,b)>=0)
{
return true;
}
else
{
return false;
}
}
}
/************************************************************************/
/* 主函数调用 */
/************************************************************************/
int main()
{
int n;
char a[1000],b[1000],c[1000];
printf("%s","计算次数: ");
scanf("%d",&n);
while (n--)
{
memset(a,'/0',sizeof(a));
memset(b,'/0',sizeof(b));
memset(c,'/0',sizeof(c));
printf("%s","被减数: ");
scanf("%s",&a);
printf("%s","减数: ");
scanf("%s",&b);
if (isBigger(a,b))
{
sub(a,b,c);
printf("%s%s/n/n","结果为: ",c);
}
else
{
sub(b,a,c);
printf("%s%c%s/n/n","结果为: ",'-',c);
}
}
return 0;
}