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

这个程序我没看懂啥意思,为什么要这么做

黑暗骑士5D 发布于 2019-11-17 21:08, 1269 次点击
我们都知道1 + 2 + 3 ... + n = n(n +1)/ 2。 现在,您的任务只是找到n(n + 1)/ 2,结果保证小于2 ^ 64。

输入规格:
输入带有十六进制整数的n

输出规格:
显示为十进制整数

输入样例:
4
样本输出:
10


int main()
{
    unsigned long long a,b;
    scanf("%llx",&a);
    b=a/2*2;
    if(b!=a)
      printf("%llu %llu",(a+1)/2*a,b);
    else
      printf("%llu %llu",a/2*(a+1),b);
    return 0;
}
3 回复
#2
rjsp2019-11-18 09:06
看不懂,什么叫“您的任务只是找到n(n + 1)/ 2”?
什么叫“输入带有十六进制整数的n”?是 输入十六进制格式的整数n 吗


这个程序我没看懂啥意思,为什么要这么做
哪里看不懂,要说出来呀
n*(n+1)/2 时,n*(n+1) 可能溢出
n/2*(n+1) 时,n 可能是奇数,导致结果不正确
(n+1)/2*n 时,n 可能是偶数,导致结果不正确
所以正确做法是 n%2==0 ? n/2*(n+1) : (n+1)/2*n
#3
黑暗骑士5D2019-11-19 12:46
回复 2楼 rjsp
这个a是以十六进制输入的吗?输入进去之后是十六进制还是十进制的数?为什么要a/2*2
#4
rjsp2019-11-19 13:14
这个a是以十六进制输入的吗?
我不知道,你贴的题目“输入带有十六进制整数的n”我又看不懂。
但看你给的代码,应该是“输入十六进制格式的整数”

输入进去之后是十六进制还是十进制的数?
数是没进制的,只有数的表达才有。假如你家有 爸爸、妈妈、你、老婆、孩子,可以说你家有五人、有five人,有5人,有0x5人,有101b人,但不能说你家人数是 中文、英文、十进制、十六进制、二进制。
同样,假如 scanf("%llx",&a); 你输入了 10,那么 a 中的值就是 0x10 表示的那个数、就是 16 表示的那个数,就是 sixteen 表示的那个数,但a的值与 十进制、十六进制、英文 无关。

为什么要a/2*2
我在二楼已经讲过了,要区分a的奇偶,分别用不同的公式。
你的代码用 a/2*2 != a 来判断它是不是奇数,当然正常人会用 a%2 != 0
1