代码前废话:因为最近那个某某某老师又出了亿些题目给我,导致更新下降,所以今天我来开一组有难度的题目
1、大小
【题目描述】
有两个正整数A和B。现在要在A的末尾添加X个0,要在B的末尾添加Y个0。问此时的A和B的大小关系,如果A大于B则输出‘>’,如果A等于B则输出‘=’,如果A小于B则输出‘<’。
【输入格式】
多组测试数据。
第一行,一个正整数G,表示有G组测试数据。1<=G<=1000。
第二行,两个整数,A和X。1<=A<=1000000,0<=X<=1000000。
第三行,两个整数,B和Y。1<=B<=1000000,0<=Y<=1000000。
【输出格式】
共G行,每行一个字符。
【输入样例】
5
2 1
19 0
10 2
100 1
1999 0
2 3
1 0
1 0
99 0
1 2
【输出样例】
>
=
<
=
<
方法一:暴力枚举(60分)
#include<bits/stdc++.h>
using namespace std;
long long a,b,y,x,g;
int main()
{
cin>>g;
for(int i=1;i<=g;i++)
{
cin>>a>>x;
cin>>b>>y;
for(int j=1;j<=x;j++)
{
a*=10;
}
for(int j=1;j<=y;j++)
{
b*=10;
}
if(a>b)cout<<">"<<endl;
else if(a==b)cout<<"="<<endl;
else cout<<"<"<<endl;
}
return 0;
}
方法二:“投机取巧”(100分)
#include<bits/stdc++.h>
using namespace std;
long long n,a,b,x,y,ka,sa[999999],kb,sb[999999],lena,lenb,p,l,ja,jb,suma,sumb,k;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
p=0;
scanf("%d %d",&a,&x);
scanf("%d %d",&b,&y);
ka=0;
for(;;)
{
ka++;
sa[ka]=a%10;
a/=10;
if(a==0)break;
}
kb=0;
for(;;)
{
kb++;
sb[kb]=b%10;
b/=10;
if(b==0)break;
}
lena=x+ka;
lenb=y+kb;
p=0;
if(lena>lenb)p=1;
else if(lena<lenb)p=-1;
else if(lena==lenb)
{
if(ka>kb)l=ka;
else l=kb;
k=1;
ja=ka;
jb=kb;
suma=0;
sumb=0;
for(int j=1;j<=l;j++)
{
if(ja<1)suma=suma*k;
else suma=suma*k+sa[ja];
if(jb<1)sumb=sumb*k;
else sumb=sumb*k+sb[jb];
k=k*10;
ja--;
jb--;
}
if(suma>sumb)p=1;
else if(suma<sumb)p=-1;
else p=0;
}
if(p==1)printf(">\n");
else if(p==-1)printf("<\n");
else if(p==0)printf("=\n");
memset(sa,0,sizeof(sa));
memset(sb,0,sizeof(sb));
}
return 0;
}