首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

UVA10790,该如何解决

2013-02-20 
UVA10790题目中明明说:Each line in the input will contain two positive integers a ( 0 a20000) and

UVA10790
题目中明明说:Each line in the input will contain two positive integers a ( 0 < a20000) and b ( 0 < b20000). 。。为什么a,ba要定义成long long int 呢?
#include<stdio.h>
int main()
{
    int count=0;
    long long int num,a,b;
    while(1)
    {
        scanf("%lld%lld",&a,&b);
        if(a==0&&b==0)
            break;
         count++;
         num=(a-1)*a*b*(b-1)/4;
        printf("Case %d: %lld\n",count,num);
    }
    return 0;
}
上面这段过了,但是下面那段就WA了呢?、
#include<stdio.h>
int main()
{
    int count=0,a,b;
    long long int num;
    while(1)
    {
        scanf("%lld%lld",&a,&b);
        if(a==0&&b==0)
            break;
         count++;
         num=(a-1)*a*b*(b-1)/4;
        printf("Case %d: %lld\n",count,num);
    }
    return 0;
}
UVA10790
[解决办法]
num=(a-1)*a*b*(b-1)/4
不定义成long long的话这个溢出。
[解决办法]

引用:
引用:num=(a-1)*a*b*(b-1)/4
不定义成long long的话这个溢出。


怎么会呢?我把num定义为long long int 了,a和b怎么会溢出呢?

不关num的事。(a-1)*a*b*(b-1)/4所有参与的数都是int,运算结果还是int(这里就溢出了),然后再int赋值到long long再做类型转换。你难道觉得num定义成double那个表达式就能算出小数来?
[解决办法]
其实num = (long long)((a - 1) * a) * (b * (b - 1)) / 4,a和b就可以用long,处理还能快点。毕竟long的乘法要比long long快得多。
[解决办法]
引用:
其实num = (long long)((a - 1) * a) * (b * (b - 1)) / 4,a和b就可以用long,处理还能快点。毕竟long的乘法要比long long快得多。

大多数情况下long就是int。a和b到20000这个数量级的话必须得用long long。
[解决办法]
20000 * 20000是4亿,long的上界大于20亿。也就是说long long范围的(a-1)*a*b*(b-1)可以拆成两个long范围的积。
[解决办法]
引用:
20000 * 20000是4亿,long的上界大于20亿。也就是说long long范围的(a-1)*a*b*(b-1)可以拆成两个long范围的积。
你和lz犯了同一个错误。4L的回复里int改成long就可以用来回复你。

热点排行