链接:https://ac.nowcoder.com/acm/contest/881/J
来源:牛客网
题目大意:给出x,a,y,b四个数,让你比较$frac{x}{a}$和$frac{y}{b}$的大小,其中$0leq x,yleq 10^{18},1leq a,bleq 10^{9}$
题解:直接移项相乘会爆long long,所以我们需要先比较$left | frac{x}{a} ight |$和$left | frac{y}{b} ight |$的大小,然后在让x%=a,y%=b,然后移项相乘进行比较即可。当然手打大数相加也可以。
C++模拟大数相加AC代码:
语言:C++ 代码长度:2106 运行时间: 938 ms 占用内存:596K
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<vector> 2 #include<cstdio> 3 #include<iostream> 4 #include<cmath> 5 #include<queue> 6 #include<cstdlib> 7 #include<cstring> 8 #define numm ch-48 9 #define pd putchar(' ') 10 #define pn putchar(' ') 11 #define pb push_back 12 #define fi first 13 #define se second 14 #define fre1 freopen("1.txt","r",stdin) 15 #define fre2 freopen("2.txt","w",stdout) 16 using namespace std; 17 template <typename T> 18 void read(T &res) { 19 bool flag=false;char ch; 20 while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true); 21 for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm); 22 flag&&(res=-res); 23 } 24 template <typename T> 25 void write(T x) { 26 if(x<0) putchar('-'),x=-x; 27 if(x>9) write(x/10); 28 putchar(x%10+'0'); 29 } 30 const int maxm=8000010; 31 const int maxn=50005; 32 const int inf=0x3f3f3f3f; 33 const int INF=0x7fffffff; 34 typedef long long ll; 35 int a[maxn]; 36 ll gcd(ll a,ll b) { 37 return b?gcd(b,a%b):a; 38 } 39 int xiangcheng(char *x,char *a,char *y,char *b) { 40 int s1[100],s2[100]; 41 if(x[0]=='0'||y[0]=='0') { 42 return x[0]>y[0]?1:(x[0]=y[0]?0:-1); 43 } 44 memset(s1,0,sizeof(s1)); 45 int l1=strlen(x); 46 int l2=strlen(b); 47 for(int i=l1-1;i>=0;i--){ 48 for(int j=l2-1;j>=0;j--) 49 s1[l1+l2-i-j-2]+=(x[i]-'0')*(b[j]-'0'); 50 for(int k=0;k<l1+l2-1;k++) 51 if(s1[k]>9){s1[k+1]+=s1[k]/10;s1[k]%=10;} 52 } 53 54 memset(s2,0,sizeof(s2)); 55 int l3=strlen(a); 56 int l4=strlen(y); 57 for(int i=l3-1;i>=0;i--) { 58 for(int j=l4-1;j>=0;j--) 59 s2[l3+l4-i-j-2]+=(a[i]-'0')*(y[j]-'0'); 60 for(int k=0;k<l3+l4-1;k++) 61 if(s2[k]>9){s2[k+1]+=s2[k]/10;s2[k]%=10;} 62 } 63 int n1=l1+l2-1;int n2=l3+l4-1; 64 if(s2[n2]==0)n2--; 65 if(s1[n1]==0)n1--; 66 if(n1>n2) return 1; 67 else if(n1<n2) return -1; 68 69 for(int i=n1;i>=0;i--) 70 if(s1[i]>s2[i]) return 1; 71 else if(s1[i]<s2[i]) return -1; 72 return 0; 73 74 } 75 int main() 76 { 77 int n,t; 78 char x[110],y[110],a[110],b[110]; 79 while(cin>>x>>a>>y>>b) { 80 int x2=xiangcheng(x,y,a,b); 81 if(x2<0) cout<<"<"; 82 else if(x2>0) cout<<">"; 83 else cout<<"="; 84 cout<<endl; 85 } 86 return 0; 87 }
java大数相加AC代码:
语言:Java 代码长度:590 运行时间: 2852 ms 占用内存:182828K
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import java.util.*; 2 import java.math.*; 3 4 public class Main { 5 public void Multiply() { 6 Scanner cin=new Scanner(System.in); 7 while(cin.hasNext()) { 8 BigInteger x=cin.nextBigInteger(); 9 BigInteger a=cin.nextBigInteger(); 10 BigInteger y=cin.nextBigInteger(); 11 BigInteger b=cin.nextBigInteger(); 12 13 BigInteger L=x.multiply(b); 14 BigInteger R=y.multiply(a); 15 16 if(L.compareTo(R)<0) System.out.println("<"); 17 else if(R.compareTo(L)<0) System.out.println(">"); 18 else System.out.println("="); 19 20 } 21 } 22 public static void main(String[] args) { 23 new Main().Multiply(); 24 } 25 }