天梯賽模擬題_(N個分數的求和)
阿新 • • 發佈:2019-01-09
這題在賽場時,考慮到了得先整體再區域性。是要將所有的分數的分母進行通同分。求出它們的最小公倍數。然後每個分數化為以最小公倍數為分母的分數 。分子部分累加起來。例如:1/3+1/2 = 5/6;(分子部分累加為5);
(注意:所有分子和分母都在長整型範圍內)。但還是沒AC出來。現在把它解決後完整的貼出來。欸,真的是一道水題,分值還有15'。
因為題目要求是要將最終結果化為 整形: 最簡分數型。
最大公約數:
long long min_Divisor(int a,int b){ //最大公約數 swap(a,b); while(a){ int c = a; a = b%a; b = c; } return b; }
化簡函式:
void simplification(long long a,long long b){ //對分數化簡
int flag = min_Divisor(a,b);
fenzhi = a/flag;
fenmu = b/flag;
}
完整程式碼:/* @天梯賽_N個分數相加 */ #include <iostream> #include <algorithm> #include <math.h> using namespace std; void swap(long long a,long long b){ //保證分母大於分子 if(a>b){ long long item = a; a = b; b = item; } else{ ; } } long long min_Divisor(int a,int b){ //最大公約數 swap(a,b); while(a){ int c = a; a = b%a; b = c; } return b; } int fenzhi = 0,fenmu = 0; //全域性變數記錄最終的分數部分 void simplification(long long a,long long b){ //對分數化簡 int flag = min_Divisor(a,b); fenzhi = a/flag; fenmu = b/flag; } int main(){ int n; cin>>n; long long x,y; char z; long long s[1000] = {0},S[1000] = {0}; //s記錄分子的值,S記錄分母的值 long long t = 1; int k = 0,K = 0; for(int i = 0;i<n;i++){ cin>>x>>z>>y; s[k++] = x; S[K++] = y; t = t*y/min_Divisor(t,y); //求出所有分數的分母的最小公倍數(t)。 } long long sum = 0; //化為以最小公倍數為分母后,各分數的分子之和 for(int j = 0;j<k;j++){ int item = t/S[j]*s[j]; sum+=item; } long long zs = sum/t; //化為以最小公倍數為分母后,整個分數的整數部分 long long f = sum-zs*t; //化為以最小公倍數為分母后,剩餘分數的分子部分 simplification(f,t); //化簡除去整形部分後的分數式 if(zs){ //整形部分不為0 if(f){ //分子部分不為0 cout<<zs<<" "<<fenzhi<<"/"<<fenmu<<endl; } else{ cout<<zs<<endl; } } else{ cout<<fenzhi<<"/"<<fenmu<<endl; } return 0; }