• HDU 1099 Lottery


    题目有点难懂,直接看样例又不太直观。不管了。其实题意很简单,实际上就是一道数学题+编码

    题意:求一个数x的f(x)=x*(1/1+1/2+···+1/x),并按照有分数是输出其带分数的形式。注意格式输出。

    1.一开始做了溢出了,仔细看看才知道__int64貌似也不兼容22!的大小,一开始用数组记录22!的阶乘的方法不行。

    2.方法很多,这里采用的是模拟手工暴力运算,先将x乘进到括号里的分数,然后相加。相加的时候将分母扩大到最小公倍数,分子相应增大,以此类推

     1 #include <stdio.h>
     2 #include <algorithm>
     3 using namespace std;
     4 #include <iostream>
     5 
     6 __int64 gcd(__int64 x1,__int64 x2){
     7     return x2 ? gcd(x2,x1%x2) : x1;
     8 }
     9 __int64 lcm(__int64 x1,__int64 x2){
    10     return x1 / gcd(x1,x2) * x2;
    11 }
    12 int getl(__int64 x){
    13     int cnt = 0;
    14     while(x>0){
    15         cnt++;x/=10;
    16     }
    17     return cnt;
    18 }
    19 void cal(int x)
    20 {
    21     int cnt = 0;
    22     __int64 fz=x,fm=1,tx;
    23     for(int i=2;i<=x;i++)
    24     {
    25         tx = lcm(fm,i);
    26         fz *= (tx/fm);
    27         fz += (tx/i*x);
    28         fm = tx;
    29         if(fz > fm) cnt+=(fz/fm) , fz %= fm;
    30         tx = gcd(fz,fm);
    31         fz /= tx;
    32         fm /= tx;
    33     }
    34     fz %= fm;
    35     //cout<<cnt<<' ' <<fz<<' '<<fm<<'
    ';
    36     if(fz == 0) cout<<cnt<<endl;
    37     else
    38     {
    39         int l1 = getl(cnt),l2 = getl(fm);
    40         for(int i=0;i<=l1;i++) cout<<' ';
    41         cout<<fz<<'
    ';
    42         cout<<cnt<<' ';
    43         for(int i=0;i<l2;i++) cout<<'-';
    44         cout<<'
    ';
    45         for(int i=0;i<=l1;i++) cout<<' ';
    46         cout<<fm<<'
    ';
    47     }
    48 }
    49 
    50 int main()
    51 {
    52     int n;
    53     while(cin>>n)
    54     {
    55         if(n==1) cout<<"1
    ";
    56         else cal(n);
    57     }
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    各种集群服务
    cdn
    网页请求的完整过程
    html
    ajax异步请求技术
    浅谈前端渲染与后端渲染的区别
    html与php
    Ubuntu安装anaconda3
    win10安装Ubuntu系统
    删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/cton/p/3438673.html
Copyright © 2020-2023  润新知