| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 578 人关注过本帖
标题:PAT测试题,网路上是遍地答案啦,但是不想应付
只看楼主 加入收藏
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:5 
PAT测试题,网路上是遍地答案啦,但是不想应付
1022. D进制的A+B (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数。

输入格式:

输入在一行中依次给出3个整数A、B和D。

输出格式:

输出A+B的D进制数。

输入样例:
123 456 8
输出样例:
1103

-------------------------------------------原题如上----------------------------------------------
程序代码:
#include<stdio.h>
#include<math.h>
#define N

int main(){
long long a,b;int c;
scanf("%lld%lld%d",&a,&b,&c);
//printf("%ld+%ld=%ld\n",a,b,a+b);
a=a+b;

 b=0;int wei=1;
//printf("a=%ldb=%ld\n",a,b);
while(a>0){
//    printf("text");
    b+=a%c*wei;
//    printf("b=%ld,",b);
    wei*=10;
    a=a/c;
//    printf("a=%ld,",a);
}
//if(a<0)a*=-1;//处理负数,从题意来说是不需要这些语句的
//while(a>0){
//    b-=a%c*wei;
//    wei*=10;
//    a=a/c;
//}

printf("%lld",b);
return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册
[/quote]----------------------------------------------------------------------------------------------------
    这段代码一开始我是用long型变量定义a,b的,后来拿去测试不过,我就换成longlong的,可是结果还是那个样子。我上度娘查了一下,longlong的数据范围是2的63次方,这样看来就不会是数据溢出的问题,测试的时候是有两个实例通过不了的。而我在本机检测的时候估摸了一下不知道会不会是负数设的陷阱,就如上添了一些代码又上机,还是不行。
    小弟最想知道的莫过于这类题目设置的边界一般都有什么规律?就好像程序测试,老师也都说要懂得利用边界值、特殊值来验证程序的健壮性。有没有哪位大神知道这种知识应该怎么学?去哪学?是算法的课程还是数据结构的课程还是别的什么?
搜索更多相关主题的帖子: 测试题 color 
2015-12-06 16:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
(<=230-1)这个条件看起来与下面的样例不符。估计原题是小于等于2的30次方减1吧。如此的话,那long long也是不必要的,int足矣。

而你的错误仍然是数据溢出。你是用一个64位整型的10进制形式来输出其他进制的数,这样它只能表示19位内的其他进制数。而以2进制为例,其极限情况下有31位。怎么能不溢出?

重剑无锋,大巧不工
2015-12-06 19:37
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 2楼 beyondyf
题目确实是限定在2的30次方(我复制过来的时候被去格式了)
/*---------------------------------*/
貌似很高能。
64位的10进制都放不下30位的二进制?我想不通。。。

φ(゜▽゜*)♪
2015-12-10 17:56
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
假设输入是 1073741823 1073741823 2
正确结果是 1111111111111111111111111111110

64位具符号整型最大值为 9223372036854775807
2015-12-11 08:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
程序代码:
#include <stdio.h>

int main( void )
{
    int a, b, d;
    scanf( "%d%d%d", &a, &b, &d );
    a += b;
    if( a == 0 )
    {
        printf( "%d\n", a );
    }
    else
    {
        char buf[32], *p;
        for( p=buf+31, *p='\0'; a!=0; a/=d )
            *--p = '0' + a%d;
        printf( "%s\n", p );
    }

    return 0;
}
2015-12-11 08:57
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 5楼 rjsp
谢谢,总算想明白了。我在把二进制转换为十进制的时候确实溢出了。。
后面我就改成用int数组存放然后解决了

φ(゜▽゜*)♪
2015-12-11 13:52
快速回复:PAT测试题,网路上是遍地答案啦,但是不想应付
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024640 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved