热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

L1-009N个数求和

主要问题是运算过程中的溢出,为防止溢出必须用简约式的运算过程,比如若case是512163210737418243276810737418241073741824107374

主要问题是运算过程中的溢出,为防止溢出必须用简约式的运算过程,比如若case是

5

1/2 16/32  1073741824/32768 1073741824/1073741824 1073741824/2147483646

最安全的做法是先对输入的分数约分,计算过程中的每一步进行约分,保证运算过程中分子的加法运算过程尽量不溢出,通分时分母乘法运算过程尽量不溢出。

分子的加法运算时溢出如

1/2+16/32=32/32

32/32+1073741824/32768=1073774592/32768

1073774592/32768+1073741824/1073741824=((2^15+1)*2^30+2^30/2^30)这里就乘法溢出了

 

分母的乘法运算中的溢出如

1073741824/1073741824+1073741824/2147483646

1073741824=2^30

2147483646/2=1073741823是个奇数,它必有一个因数x>2.

2^30*x>2^31这里发生了乘法溢出

故按照保守的想法,程序如下

#include
#include
typedef struct fraction
{
    long long it;//integer
    long long nmr;//numerator
    long long dnm;//denominator
}fraction;
int main()
{
    long long EUCLID_GCD (long long a,long long b);//GCD=greatest_common_divisor
    long long n,i,gcd=1,it=0,nm=0,sum=0,cd=1,cd0=1;//cd=common_denominator
    scanf("%lld",&n);
    getchar();
    fraction frc[n];
    for(i=0;i)
    {
        scanf("%lld/%lld",&frc[i].nmr,&frc[i].dnm);
        gcd=EUCLID_GCD(abs(frc[i].nmr),abs(frc[i].dnm));
        frc[i].nmr=frc[i].nmr/gcd;
        frc[i].dnm=frc[i].dnm/gcd;
        frc[i].it=frc[i].nmr/frc[i].dnm;
        frc[i].nmr=frc[i].nmr%frc[i].dnm;
        getchar();                         //simplification
    }
    for(i=0;i)
    {
        cd0=cd;
        gcd=EUCLID_GCD(abs(cd),abs(frc[i].dnm));
        cd=(frc[i].dnm/gcd)*cd;                     //reduction of fractions to a common denominator
        sum=(cd/frc[i].dnm)*frc[i].nmr+(cd/cd0)*sum;//summation

        gcd=EUCLID_GCD(abs(cd),abs(sum));
        sum=sum/gcd;
        cd=cd/gcd;                                  //reduction of a fraction

        it=it+sum/cd+frc[i].it;
        sum=sum%cd;                                 //get integer part
    }

    nm=sum;
    if(it<0&&nm<0)
    {
        printf("%lld %lld/%lld",it,nm,cd);
    }else if(it<0&&nm==0)
    {
        printf("%lld",it);
    }else if(it==0&&nm!=0)
    {
        printf("%lld/%lld",nm,cd);
    }else if(it>0&&nm>0)
    {
        printf("%lld %lld/%lld",it,nm,cd);
    }else
    {
        printf("%lld",it);
    }
    return 0;
}

long long EUCLID_GCD (long long a,long long b)
{
    if(b==0)return a;
    else return EUCLID_GCD(b,a%b);
}

 


推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
一切近乎完美
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有