2019牛客多校第一场 J Fraction Comparision(比较/大数相加)

链接:https://ac.nowcoder.com/acm/contest/881/J
来源:牛客网


题目大意:给出x,a,y,b四个数,让你比较$\frac{x}{a}$和$\frac{y}{b}$的大小,其中$0\leq x,y\leq 10^{18},1\leq a,b\leq 10^{9}$

题解:直接移项相乘会爆long long,所以我们需要先比较$\left | \frac{x}{a} \right |$和$\left | \frac{y}{b} \right |$的大小,然后在让x%=a,y%=b,然后移项相乘进行比较即可。当然手打大数相加也可以。

C++模拟大数相加AC代码:

语言:C++ 代码长度:2106 运行时间: 938 ms 占用内存:596K 

 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('\n')
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 

 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 }
代码在这里!

猜你喜欢

转载自www.cnblogs.com/wuliking/p/11240233.html
今日推荐