#include <stdio.h>
#include <iostream>
using namespace std;
#define N 19
void getleast(char a[N],char b[N],char result[N])
{
//a为含‘0’、....、'9'的字符数组,b、result也一样含‘0’、....、'9',其中a为一个数,b也为数,c则记录a中含有多少个以b为结尾的数
int m=0,n=0;
m=strlen(a);
n=strlen(b);
//如果m<n,说明a代表的数小于b代表的数。故从0到a的数以b结尾的个数为0
if(m<n)
{
int i=0;
result[0]='0';
for(i=1;i<N;i++)
result[i]='\0';
}
//如果m==n,还得判断a是否大于b,若a>=b,则从0到a以b结尾的数为1,否则为0
if(m==n)
{
int mn=0;
int i=0;
for(i=0;i<n;i++)
{
if( b[i]>a[i] )
{
mn=0;
break;
}
if( b[i]<a[i])
{
mn=1;
break;
}
mn=1;
}
if(mn==0)
{
result[0]='0';
result[1]='\0';
}
//mn=1,说明a==b
if(mn==1)
{
result[0]='1';
result[1]='\0';
}
}
if(m>n)
{
int i=0;
for(i=0;i<(m-n);i++)
{
result[i]=a[i];
}
//判断a的低n位与b的低n位大小
int mn=0;
i=0;
for(i=0;i<n;i++)
{
if( b[i]>a[i+(m-n)] )
{
mn=0;
break;
}
if( b[i]<a[i+(m-n)])
{
mn=1;
break;
}
mn=1;
}
//mn=0说明a的低n位代表的数小于b的低n位代表的数
if(mn==0)
{
result[m-n]='\0';
}
//mn==1说明a的低n位代表的数大于或等于b的低n位代表的数
if(mn==1)
{
//将result最后一项加1,如a=321,b=21,则result=3+1而不是3
//如果result最后一项不为'9'
if(result[m-n-1]!='9')
{
result[m-n-1]=result[m-n-1]+1;
result[m-n]='\0';
}
//如果result最后一项为'9'
else
{
int len=m-n;
int p=0;
int ad=0;
for(p=len-1;p>=0;p--)
{
ad=0;
if(result[p]=='9')
{
result[p]=0;
ad=1;
}
else
{
result[p]=result[p]+ad;
ad=0;
break;
}
}
if(ad==1) //说明原来result中全为'9',只需第一项为‘1’,其余填m-n+1个'0'即可
{
result[0]='1';
int n1=0;
for(n1=1;n1<m-n+1;n1++)
{
result[n1]='0';
}
result[m-n+1]='\0';
}
}
}
}
}
//求两个字符数组差,若c!=d,result=b-a;若c==d,result=b-a+1;
void dec(char a[N],char b[N],char c[N],char d[N],char result[N])
{
//求字符数组b-a
int lena=0,lenb=0;
lena=strlen(a);
lenb=strlen(b);
if(lena==lenb)
{
int i=0;
for(i=lena-1;i>=0;i--)
{
if(b[i]>=a[i])
{
result[i]=(b[i]-a[i])+'0';
}
else
{
b[i]=b[i]+10;
b[i-1]=b[i-1]-1;
result[i]=(b[i]-a[i])+'0';
}
}
result[lenb]='\0';
}
if(lena<lenb)
{
int i=0;
int borrow=0;
int st=0;
for(st=0;st<lenb-lena;st++)
{
result[st]=b[st];
}
for(i=lena-1;i>=0;i--)
{ borrow=0;
if(b[i+(lenb-lena)]>=a[i])
{
result[i+(lenb-lena)]=(b[i+(lenb-lena)]-a[i])+'0';
}
else
{
borrow=1;
b[i+(lenb-lena)]=b[i+(lenb-lena)]+10;
b[i+(lenb-lena)-1]=b[i+(lenb-lena)-1]-1;
result[i+(lenb-lena)]=(b[i+(lenb-lena)]-a[i])+'0';
}
}
if(borrow==1)//说明b的低位-a,不够减
{
int k1=0;
int bor=1;
for(k1=lenb-lena-1;k1>=0;k1--)
{
if(b[k1]<'0')
{
b[k1]=b[k1]+10;
b[k1-1]=b[k1-1]-1;
}
result[k1]=b[k1];
}
}
result[lenb]='\0';
}
如果c==d,则原来的结果为b-a+1
int lenc=strlen(c);
int lend=strlen(d);
int necd=0;
int mt=0;
if(lenc==lend)
{
for(mt=0;mt<lenc;mt++)
{
if(c[mt]==d[mt] )
necd++;
else
{
break;
}
}
}
if(necd==lenc ) //说明c[i]==d[i]
{
//结果应该为b-a+1
if(result[lenb-1]!='9') //如果result最后一位不为‘9’
result[lenb-1]=result[lenb-1]+1;
else //如果result最后一位为‘9’
{
char temp[N];
int d=0;
int add=1;
for(d=lenb-1;d>=0;d--)
{
if(add==1)
{
result[d]=result[d]+1;
if(result[d]>'9')
{
result[d]='0';
add=1;
}
//赋值给temp,是为了防止result全为'9',由于进位导致多一位
temp[d+1]=result[d];
}
else
{
temp[d+1]=result[d];
}
}
//判断result是否全为'9'
if(add==1)
temp[0]='1';
else
temp[0]='0';
int ns=0;
for(ns=0;ns<lenb+1;ns++)
{
result[ns]=temp[ns];
}
}
result[lenb]='\0';
}
下面将result[i]中开头的'0'去掉
char resu[N];
int x=0;
int sum=0;
for(x=0;x<lenb;x++)
{
if(result[x]=='0')
sum++;
else
break;
}
int js=0;
for(js=sum;js<lenb;js++)
{
result[js-sum]=result[js];
}
if(sum!=lenb)
result[lenb-sum]='\0';
else
result[1]='\0';
}
int main()
{
int T=0;
scanf("%d",&T);
char input[10000][3][N];
//x,a,b的长度
int length[10000][3];
char value[10000][N];
int i=0;
for(i=0;i<T;i++)
{
scanf("%s %s %s",&input[i][0],&input[i][1],&input[i][2]);
length[i][0]=strlen(input[i][0]);
length[i][1]=strlen(input[i][1]);
length[i][2]=strlen(input[i][2]);
}
int j=0;
for(j=0;j<T;j++)
{
//判断
//1、x长度大于b的长度
if(length[j][2]<length[j][0])
{ int i=0;
value[j][i]='0';
for(i=1;i<N;i++)
{
value[j][i]='\0';
}
}
else
{
char tempa[N],tempb[N];
getleast(input[j][1],input[j][0],tempa);
getleast(input[j][2],input[j][0],tempb);
dec(tempa,tempb,input[j][0],input[j][1],value[j]);
}
}
int k=0;
//输出结果
for(k=0;k<T;k++)
{
cout<<value[k]<<endl;
}
return 0;
}
百度之星2012--No.2
最新推荐文章于 2021-01-23 21:32:25 发布