1. 程式人生 > >天梯賽模擬題_(N個分數的求和)

天梯賽模擬題_(N個分數的求和)

這題在賽場時,考慮到了得先整體再區域性。是要將所有的分數的分母進行通同分。求出它們的最小公倍數。然後每個分數化為以最小公倍數為分母的分數 。分子部分累加起來。例如: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;
}