注册 登录
编程论坛 C语言论坛

区间l到r内有多少数是w的幂次 求找错

Sky_ 发布于 2019-12-29 18:21, 3702 次点击
输入
输入包含多组数据。
输入的第一行为一个整数t(1<=t<=1000),代表测试用例的组数。
接下来的t组测试用例按照如下格式给出:
每组数据占一行,第一行有3个正整数l,r,w(1<=l<=r<=1e18,1<=w<=1e9)
输出
对于每一组测试数据,在新的一行中输出所有满足条件的数字,每两个数字中间有一个空格,如果没有满足条件的数字则输出-1。
样例输入
2
1 10 2
2 4 5
样例输出
1 2 4 8
-1
但数据是1 1000000000000000000 1000000000时 答案是错误的 不知道为什么 求大佬解答
只有本站会员才能查看附件,请 登录



13 回复
#2
吕孟伟2019-12-29 19:02
你不把代码发出来怎么找错呀?
#3
Sky_2019-12-29 19:24
回复 2楼 吕孟伟
我忘了。。。。。
#include<stdio.h>
int main ()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        long long l,r,w;
        long long ans=1;
        int flag=0;
        scanf("%lld%lld%lld",&l,&r,&w);
        if(l==1)
            printf("1 ");
        if(w>r) printf("-1");
        else
        {
            for(int i=1; i<r; i++)
            {
                ans*=w;
                if(ans>=l&&ans<=r)
                {
                    printf("%lld ",ans);
                    flag=1;
                }
                else if(ans>r) break;

            }
            if(flag==0) printf("-1");
        }
        printf("\n");
    }
    return 0;
}

#4
纯蓝之刃2019-12-29 19:40
这个是输入一组输出一组的,如果想要输入完后一起输出,可以吧输出数据存在数组里,最后一起输出。
程序代码:
#include<stdio.h>
int main ()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        long long l,r,w;
        long long ans=1;
        int flag=0;
        scanf("%lld%lld%lld",&l,&r,&w);

        if(w>r)
            printf("-1");
        else
        {
            if(l==1)
                printf("1 ");

            while(1)
            {
                ans*=w;
                if(ans<=r)
                {
                    printf("%lld ",ans);
                    flag=1;
                }
                else
                    break;

            }
        }
        printf("\n");
    }
    return 0;
}
#5
Sky_2019-12-29 20:01
回复 4楼 纯蓝之刃
提交之后显示输出超限 而且输入1 100000000000000000 1000000000 程序就炸了
#6
forever742019-12-29 20:45
你天真的,
以为总有某次幂超过r还能合法表达,
这就是错误,因为它直接溢出了。
#7
纯蓝之刃2019-12-29 21:22
程序代码:
#include<stdio.h>
int main ()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        long long l,r,w;
        long long ans=1;
        int flag=0;
        scanf("%lld%lld%lld",&l,&r,&w);

        if(w>r)
            printf("-1");
        else
        {
            if(l==1)
                printf("1 ");

            while(1)
            {
                if(ans<=(r/w+1))
                {
                    ans*=w;
                    printf("%lld ",ans);
                    flag=1;
                }
                else
                    break;
            }
        }
        printf("\n");
    }
    return 0;
}

那就改成这样试试
#8
Sky_2019-12-30 09:06
多谢大佬
样例是没问题了 但改了好几遍一直是输出超限 不知道该咋办了
输出超限是什么原因呐
#9
forever742019-12-30 11:53
看你的输出模式,也许是最右边多余一个空格造成的
#10
叶纤2019-12-31 17:26
每组数据占一行,第一行有3个正整数l,r,w(1<=l<=r<=1e18,1<=w<=1e9)
先说一下,你的程序整体是对的,楼主也很聪明的用了l r w 的规定范围测试
longlong的范围是一个十九位的,那么楼主何不改个20范围的类型?比如unsigned longlong
#include<stdio.h>
int main ()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        unsigned long long l,r,w;
       unsigned long long ans=1;
        int flag=0;
        scanf("%lld%lld%lld",&l,&r,&w);
        if(l==1)
            printf("1 ");
        if(w>r) printf("-1");
        else
        {
            for(int i=1; i<r; i++)
            {
                ans*=w;
                if(ans>=l&&ans<=r)
                {
                    printf("%lld ",ans);
                    flag=1;
                }
                else if(ans>r) break;

            }
            if(flag==0) printf("-1");
        }
        printf("\n");
    }
    return 0;
}
//楼主在试一试,看是否可以,我是通过C++大版主身上总结了 unsigned这个
#11
forever742019-12-31 17:46
那个用例的下一次方是28位的哦
#12
Sky_2020-01-04 13:01
回复 10楼 叶纤
谢谢解答 按你的改10^18这个问题确实解决了 但提交还是答案错误 估计是程序哪有问题吧
#13
叶纤2020-01-04 16:48
回复 12楼 Sky_
你的程序肯定容易出错啊,老师规定了范围说明你老师肯定在这地方栽过跟头,所以规定了范围,目的是不让学生也栽跟头,可你硬往石头上撞,也栽了跟头,跟头归跟头,学生不懂老师在哪里栽过跟头,电脑也不知道什么是跟头,最后跟头变成了一个无止限的跟头,稍微来点出格的事情就会变成一个更大的跟头,然后就会出现所谓的BUG
#14
rjsp2020-01-06 09:15
懒得验证,仅供参考
程序代码:
#include <stdio.h>

void foo( unsigned long long l, unsigned long long r, unsigned long long w )
{
    unsigned count = 0;
    for( unsigned long long t=1; t<=r; t*=w )
    {
        if( t >= l )
        {
            ++count;
            printf( "%llu ", t );
        }
        if( t*w/w != t )
            break;
    }
    if( count == 0 )
        printf( "-1" );
    putchar( '\n' );
}

int main( void )
{
    unsigned t;
    scanf( "%u", &t );
    while( t-- )
    {
        unsigned long long l, r, w;
        scanf( "%llu%llu%llu", &l, &r, &w );
        foo( l, r, w );
    }
}

1