洛谷1080 大數除法 除數小(在ll內)
阿新 • • 發佈:2018-12-04
如果除數是一個可以表示的數就好解決了,可以直接將之前運算結果儲存在一個long long型別的數組裡面,陣列的每一位裡面都是一位(只不過是有點佔用空間,但是效果也是明顯的好)
另外注意題目中說了,一定會有金幣,所以輸出至少為1.
#include <bits/stdc++.h> using namespace std; const int maxn=10005; #define ll long long struct Node{ int a,b; ll pro; bool operator<(Node a)const{ return this->pro < a.pro; } }node[maxn]; ll a[100000]; void cal(int t)//將one乘上all,記錄在all裡面//第一位裡面存的是長度 { int i,len=a[0]; for(i=1;i<=len;i++) a[i]*=t; for(i=1;i<=len;i++){ if(a[i]>9){ a[i+1]+=a[i]/10; a[i]=a[i]%10; } } while(a[i]){ if(a[i]>9){ a[i+1]+=a[i]/10; a[i]=a[i]%10; } i++; } a[0]=i-1; } void chu(int t) { int i; int len=a[0]; for(i=a[0]+1;i>0;i--){ a[i-1]+=(a[i]%t)*10; a[i]=a[i]/t; } while(0==a[len]) len--; a[0]=len; } int main() { int n,i,j; ll g_a,g_b; cin>>n; cin>>g_a>>g_b; cal(1); a[0]=1,a[1]=g_a; for(i=0;i<n;i++){ scanf("%d %d",&node[i].a,&node[i].b); node[i].pro=node[i].a*node[i].b; } sort(node,node+n); int temp; for(i=0;i<n-1;i++){ temp=node[i].a; cal(temp); } chu(node[n-1].b); for(i=a[0];i>0;i--){ printf("%lld",a[i]); } if(0==a[0]) printf("1");//所有的大臣都會獲得一定的金幣 printf("\n"); return 0; }