Overflow UVA 465 方法二求纠错

注明:

本题使用了两种解法,第一种参考了网上一种非常普遍的解法,即使用atof函数将两个数字字符串转化为两个浮点数,然后直接和int的最大值比较即可。这种方法较简单,不过也是在数据较小的情况下行得通。而第二种是我自己写的一种更较为普遍的解法,其实也就是直接根据字符串进行高精度的运算而已。自己用了很多数据进行测试都没有错,可是就是AC不了,不知道为什么。希望大神指教!!!

题目:

Overflow

Write a program that reads an expression consisting of two non-negative integer and an operator. Determine if either integer or the result of the expression is too large to be represented as a ``normal‘‘ signed integer (type
integer if you are working Pascal, type int if you are working in C).

Input

An unspecified number of lines. Each line will contain an integer, one of the two operators
+ or *, and another integer.

Output

For each line of input, print the input followed by 0-3 lines containing as many of these three messages as are appropriate: ``first number too big‘‘, ``second number too big‘‘, ``result too big‘‘.

Sample Input

300 + 3
9999999999999999999999 + 11

Sample Output

300 + 3
9999999999999999999999 + 11
first number too big
result too big

源代码:(解法一)

#include <stdio.h>
#include <stdlib.h>
#define INT 2147483647

int main(){
 double a,b;
 char x[500],y[500];
 char operator;
 while(scanf("%s %c %s",x,operator,y)==3){
  a=atof(x);
  b=atof(y);
  if(a>INT) printf("first number too big\n");
  if(b>INT) printf("second number too big\n");
  if(operator=='+'&&a+b>INT||operator=='*'&&a*b>INT)
  printf("result too big\n");
 }

 return 0;
}

(解法二)

#include <stdio.h>
#include <string.h>
#define MAXN 1000+5

char x[MAXN],y[MAXN];
char operator;
char ans[MAXN];//存储答案的字符串,未必从开头开始
char Int[]="2147483647";
char *p;//指向ans中,答案字符串开始的位置

int int_cmp(char *);//比较输入字符串和Int的大小,大于返回1,否则返回0
void add();
void multip();

int main(){
 //freopen("data","r",stdin);
 while(scanf("%s %c %s",x,&operator,y)==3){
  printf("%s %c %s\n",x,operator,y);
  if(int_cmp(x))  printf("first number too big\n");

  if(int_cmp(y))  printf("second number too big\n");

  if(operator=='+')  add();
  else if(operator=='*')  multip();

  if(int_cmp(p)) printf("result too big\n");

  }

  return 0;
}

int int_cmp(char *s){
 int len1=strlen(Int);
 int len2=strlen(s);
 int i;

 if(len2>len1)
 return 1;
 else if(len1>len2)
 return 0;
 else {
  for(i=0;i<len1;i++)
   if(Int[i]<s[i]) return 1;
   else if(Int[i]>s[i]) return 0;

   return 0;
 }
}

void add(){//两个字符串的加法
 int j=MAXN-1;
 int carry,sum;
 int len1=strlen(x),len2=strlen(y);
 int i,max;
 max=len1>len2?len1:len2;

 ans[j--]='\0';
 carry=0;
 for(i=0;i<max;i++){//从两串的末尾开始相加,结果从ans的末尾开始放入
  sum=carry;
  if(len1-i>0) sum+=x[len1-i-1]-'0';
  if(len2-i>0) sum+=y[len2-i-1]-'0';
  ans[j--]=sum%10+'0';
  carry=sum/10;
  }

 while(carry){//将剩余的进位依次放好
  ans[j--]=carry%10+'0';
  carry/=10;
 }
 p=ans+j+1;

 while(*p=='0')
 p++;
 if(*p=='\0')
 p--;

 return ;
}

void multip(){
 int i,j,left,k,pos,product,carry;
 int x_len,y_len;

 ans[MAXN-1]='\0';
 k=left=MAXN-1;
 x_len=strlen(x);
 y_len=strlen(y);

 for(i=0;i<MAXN-1;i++)
 ans[i]='0';

 for(i=y_len-1;i>=0;i--){
 k--;//标记每个乘数最右的位置
 pos=k;
 carry=0;
 for(j=x_len-1;j>=0;j--){
  product=(y[i]-'0')*(x[j]-'0')+ans[pos]-'0'+carry;
  ans[pos]=product%10+'0';
  pos--;
  carry=product/10;
  }

  while(carry){
  carry+=ans[pos]-'0';
  ans[pos]=carry%10+'0';
  pos--;
  carry/=10;
  }

  left=left<=pos+1?left:pos+1;
  }

  p=ans+left;
  while(*p=='0')//若答案串的前面有0,则去掉
  p++;
  if(*p=='\0')
  p--;
  return;
}

Overflow UVA 465 方法二求纠错,布布扣,bubuko.com

时间: 2024-11-08 19:23:07

Overflow UVA 465 方法二求纠错的相关文章

UVa 465 Overflow——WA

上次那个大数开方的高精度的题,UVa113 Power of Cryptography,直接两个double变量,然后pow(x, 1 / n)就A过去了. 怎么感觉UVa上高精度的题测试数据不给力啊... 话说回来,我写了100+行代码,WA了,后来考虑到要忽略前导0,又WA了,实在不知道哪出问题了.  Overflow  Write a program that reads an expression consisting of twonon-negative integer and an

uva 465 Overflow 还是高精度。。。

通过这道题,我学会了一个函数atof:把字符串转换为double类型,头文件:stdlib.h 还知道了double类型可以表示的范围:-1.79E+308 ~ +1.79E+308,float类型表示的范围:-3.40E+38 ~ +3.40E+38,原因是因为他们的存储方式不一样,而且是扩大了表示范围从而牺牲了精度,这种知识点我就不深究 了,这道题需要注意前导0的问题,然后比较一下就可以了,每天学点新知识挺爽的,我目前目标一天一道白书的题 目,没空做了第二天补过来 代码: #include<

UVA计数方法练习[3]

UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 // // Created by Candy on 24/10/2016. // Copyright © 2016 Candy. All rights reserved. // #include <iostream> #include <cstdio> #include <cst

关于CSS清除浮动的几种方法

如果一个父元素的所有子元素都设置了float效果,则该父元素的高度不会被撑开且颜色也不会显示.这是因为子元素设置float效果后脱离了标准的文档流, 不占据文档空间所以不能把父元素撑开.有时为了解决这个问题可以使用下面几种方法来清除浮动效果. 方法一:使用空标签 该方法就是在子元素后再添加一个空标签,空标签可以是<div>也可以是<p>等,但是要设置样式clear : both ;这样就可以达到清除浮动的效果. 方法二:给父元素设置overflow: auto; 该方法是给父元素设

5.4php不支持dede的解决方法

想试试织梦的产品,下载了DedeCMS V5.7版本,在本地部署后,正确登录后台的情况下页面没有任何输出和显示(错误登录或密码错误时才有显示),也没有报错.进到脚本调试,发现问题出在登录页login.php中以下部分. login.php [php] view plaincopy ... $cuserLogin = new userLogin($admindir); if(!empty($userid) && !empty($pwd)) { $res = $cuserLogin->c

清浮动的方法

浮动原理及清浮动 浮动: left/right/none 元素加了浮动,会脱离文档流(文档流是文档中可显示对象在排列时所占用的位置) ,按照指定的一个方向移动直到碰到父级的边界或者另外一个浮动元素停止 1.使块元素在一行显示:  2.使内嵌支持宽高:  3.不设置宽度的时候宽度由内容撑开:  4.脱离文档流 : 5.提升层级半层. 清浮动的方法  1.加高  问题:扩展性不好 2.父级浮动  问题:页面中所有元素都加浮动,margin左右自动失效 3.inline-block 清浮动方法:  问

(转)CSS Overflow 属性

原文链接:http://www.qianduan.net/css-overflow-property.html 根据CSS的盒模型概念,页面中的每个元素,都是一个矩形的盒子.这些盒子的大小.位置和行为都可以用CSS来控制.对于行为,我的意思是当盒子内外的内容改变的时候,它如何处理.比如,如果你没有设置一个盒子的高度,该盒子的高度将会根据它容纳内容的需要而增长.但是当你给一个盒子指定了一个高度或宽度而里面的内容超出的时候会发生什么?这就是该添加CSS的overflow属性的时候了,它允许你设定该种

IE6常见的bug及解决方法

1.IE6怪异解析之padding与border算入宽高 原因:未加文档声明造成非盒模型解析 解决方法:加入文档声明<!doctype html> 2.IE6在块元素.左右浮动.设定marin时造成margin双倍(双边距) 解决方法:display:inline 3.以下三种其实是同一种bug,其实也不算是个bug,举个例子:父标签高度20,子标签11,垂直居中,20-11=9,9要分给文字的上面与下面,怎么分?IE6就会与其它的不同,所以,尽量避免. 1)字体大小为奇数之边框高度少1px

ie浏览器中 overflow:hidden无作用的解决方案

原因: overflow:hidden失效 当父元素的直接子元素或者下级子元素的样式拥有position:relative属性时,父元素的overflow:hidden属性就会失效. 我在ie内发现子元素会超出父元素设定的高度,即使父元素设置了overflow:hidden. 方法:解决这个bug很简单,在父元素中使用position:relative;即可解决该bug 我的办法:子元素设置绝对定位,父元素相对定位,这样overflow:hidden就不会失效了.