HDOJ 1753 明朝A+B
http://acm.hdu.edu.cn/showproblem.php?
pid=1753
大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8296 Accepted Submission(s): 2929
这时他已经不是那个仅仅会做100以内加法的那个“小明”了。如今他甚至会随意长度的正小数的加法。
如今,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
每一组測试数据在一行里面包括两个长度不大于400的正小数A和B。
具体要求请见Sample Output。
1.1 2.9
1.1111111111 2.3444323343
1 1.1
4
3.4555434454
2.1
先计算小数位的和,由于十分位可能向各位进位,进位时a[0]+=1即可。然后后边直接用;
然后计算整数位的和。也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-'0',由于要考虑进位
/*思路清晰,算法仅仅用到了大数,但里边须要注意的地方非常多
先计算小数位的和。由于十分位可能向各位进位,进位时a[0]+=1即可,然后后边直接用;
然后计算整数位的和,也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-'0',由于要考虑进位
*/
#include<stdio.h>
#include<string.h>
#define MAX 450
int main()
{
int a[MAX],b[MAX],num_1[MAX],num_2[MAX],i,j,k,n;
char s1[MAX],s2[MAX];
while(~scanf("%s %s",s1,s2))
{
memset(num_1,0,sizeof(num_1));
memset(num_2,0,sizeof(num_2));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
n=strlen(s1);
for(i=0;i<n;i++)//s1[i]为小数点
if(s1[i]=='.') break;
for(k=0,j=n-1;j>i;j--,k++)//s1有k位小数
num_1[k]=s1[j]-'0';
int i_1=i,k_1=k,n_1=n; n=strlen(s2);
for(i=0;i<n;i++)//s2[i]为小数点
if(s2[i]=='.') break;
for(k=0,j=n-1;j>i;j--,k++)//s2有k位小数
num_2[k]=s2[j]-'0';
int i_2=i,k_2=k,n_2=n;
if(k_1>=k_2)//小数相加,注意十分位进位的情况 //分两这情况(k_1>=k_2)和(k_1<k_2)是由于不确定哪个小数点后的位数大
{//假设k_1>=k_2,把计算的结果放到num_1[]中
for(i=k_1-k_2,j=0;i<k_1;i++,j++)
{
num_1[i]+=num_2[j];
if(num_1[i]>=10)
{
num_1[i]-=10;
num_1[i+1]+=1;
}
//printf("%d#\n",num_1[i]);
}
if(num_1[i]==1)//十分位进到个位
{
num_1[i]-=1;
a[0]+=1;
}
}
else if(k_2>k_1)//假设k_2>k_1,把计算的结果放到num_2中。 {
for(i=k_2-k_1,j=0;i<k_2;i++,j++)
{
num_2[i]+=num_1[j];
if(num_2[i]>=10)
{
num_2[i]-=10;
num_2[i+1]+=1;
} }
if(num_2[i]==1)//十分位进到个位
{
num_2[i]-=1;
a[0]+=1;
}
}
//上边小数位相加分两种情况。下边小数位的输出也分两种情况 for(j=0,i=i_1-1;i>=0;i--,j++)//这里是a[j]+=s1[i]-'0',由于考虑到小数会给a[0]进位。 a[j]+=s1[i]-'0'; //这里事实上仅仅给a[0]+=s1[o]-'0',其余还是a[j]=s1[i]-'0',仅仅是这样写和把a[0]独分出来效果一样,就这样写了
for(j=0,i=i_2-1;i>=0;i--,j++)//给b[0]赋值时和a[]一样
b[j]=s2[i]-'0';
for(i=0;i<MAX;i++)//计算整数部分。存到a[]中
{
a[i]+=b[i];
if(a[i]>=10)
{
a[i]-=10;
a[i+1]+=1;
}
}
for(i=MAX-1;i>0;i--)//输出整数部分
if(a[i]!=0) break;
for(;i>=0;i--)
printf("%d",a[i]); if(k_1>=k_2)//输出小数部分
{
for(i=k_1-1;i>=0;i--)//这里的for循环是推断小数点后是否有值,假设没有值,循环进行究竟。最后i是-1
if(num_1[i]!=0) break;//假设i==-1。则不运行下边if(i!=-1),也就是不输出小数点和小数点后边的0
for(j=0;j<k_1;j++)//这个for循环的作用是不输出计算得到的小数后边的0,如1.028+1.072。 在for之前结果是2.100,运行完for就把 后边的0去掉,结果为2.1
if(num_1[j]!=0) break;
if(i!=-1)//假设小数点后边有值,输出小数点和后边的数
{
printf(".");
for(i=k_1-1;i>=j;i--)
printf("%d",num_1[i]);
}
}
else if(k_1<k_2)//这里的if和上边一样
{
for(i=k_2-1;i>=0;i--)
if(num_2[i]!=0) break;
for(j=0;j<k_2;j++)
if(num_2[j]!=0) break;
if(i!=-1)
{
printf(".");
for(i=k_2-1;i>=j;i--)
printf("%d",num_2[i]);
}
}
printf("\n"); }
return 0;
}
/*
0 0
1.2333 1.2667
99999 1
12121213213124342545354545 13312312321312321321.02300000000000000000000000000
1.0001 1.00002
99999.889 0.111
1000.0 10000.0
112233.1 333.9
123450000 777
123400000 777.700
0.000 0.0000
1212121212.1111111 21212121.33300000000000000
*/
版权声明:本文博主原创文章。博客,未经同意不得转载。
HDOJ 1753 明朝A+B的更多相关文章
- hdoj 1753 大明A+B 高精度/java
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDOJ 1753 大明A+B
JAVA大数.... 大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- [HDOJ] 1753.大明A+B (大数加法)
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...
- hdoj 1753 (Java)
刚刚开始用Java,代码难免不够简洁. import java.math.BigDecimal; import java.util.Scanner; public class Main { publi ...
- 【HDOJ】1753 大明A+B
注意数据格式,可以是整数,并且注意输出最简化浮点数. #include <stdio.h> #include <string.h> #define MAXNUM 420 cha ...
- SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
相信很多人进行数据存储时,会遇上如标题的异常错误. 其实也不算上一个错误. 当你的程序中有宣告一个字段的数据类型为DateTime时,但你又没有赋值给它,就进行存储时,它就会得到这样一个结果. 看看下 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDOJ 2317. Nasty Hacks 模拟水题
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
随机推荐
- C++ 复制功能
C++ 复制功能 说C++复制功能,它可能不是很熟悉.类中的拷贝构造函数和赋值操作符.可是其实或许我们一不小心就会忽略编译器所做的一些默认操作.引起晦涩的错误.以下分析几种场景: 一.场景一:所有默认 ...
- 【译】手动处理Team Foundation Server 2010 数据仓库和分析服务数据库
原贴地址:Manually Processing the Team Foundation Server 2010 Data Warehouse and Analysis Services Databa ...
- Java的Log系统介绍和切换(转)
Java的log系统比较繁杂.在这里梳理一下.本文只涉及log系统介绍和处理log系统之间的切换.不涉及如何配置和使用. 具体的log系统 Log4j:准确的说是log4j 1.x版.是之前使用最广泛 ...
- [置顶] android系统如何在静音模式下关闭camera拍照声音(2)
之前写过一篇“android系统如何在静音模式下关闭camera拍照声音”的博客,今天来写他的续篇,继续探讨这个问题. 公司新需求,要求在camera应用中添加一个开关,可以进行拍照声音的关闭和开启. ...
- CentOS6.5 Nginx优化编译配置
说到Nginx,它真的算是我在运维工作中的好朋友,它优异的性能和极高的工作效率实在是让人大爱,来自internet的报告称其epoll模型能够支持高达50000个并发连接数. Epoll[维基百科]: ...
- Java泛型中extends和super的理解(转)
E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定 ...
- HTTP求
client联系server后,至server获取问题 Web 新闻资源,简称client至server发送一个 HTTP 求. 一个完整的 HTTP 该请求包含以下示例: ① ②若干消息头(请求头) ...
- [TWRP 2.8.4] for 小米2S/2SC 支持中英文切换
其中这个 twrp 2.8.4 在18号的下午已经编译好了. 经历了2个小时的代码修改,再经过后期的调试,中英文双语版本的twrp出炉了. 下面上几张图: 图片1:为英文界面 图片2: 图片3:中文界 ...
- Java中动态代理技术生成的类与原始类的区别
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...
- MySQL 最经常使用的一千行
/* 启动MySQL */ net start mysql /* 连接和断开server */ mysql -h 住址 -P port -u username -p password /* 跳过许可认 ...