- 注册时间
- 2009-5-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 38540
- 在线时间
- 小时
|
楼主 |
发表于 2022-12-29 10:50:43
|
显示全部楼层
好像使用__uint128_t类型,直接乘就行:
- #include<cstdio>
- __uint128_t a;
- int main()
- {
- a=14757395258967641293;
- a=a*14757395258967641293;
- printf("%I64u %I64u\n",(unsigned long long)(a>>64),(unsigned long long)(a));
- }
- //运行结果:
- /*
- 11805916207174113034 10330176681277348905
- --------------------------------
- Process exited after 0.01809 seconds with return value 0
- */
复制代码 输出的时候:
1、先右移64位,然后转换成unsigned long long输出,就是高64位
2、直接转换成unsigned long long输出,就是低64位
如果要严格按照楼主的要求,读入2个64位无符号整数,然后输出它们的乘积,就这样写:
- #include<cstdio>
- __uint128_t a;
- unsigned long long x,y,h,l;
- int main()
- {
- scanf("%I64u %I64u",&x,&y);
- a=x;
- a=a*y;
- h=a>>64;
- l=a;
- printf("%I64u %I64u\n",h,l);
- }
复制代码 运行后输入:
18446744073709551615 18446744073709551615
就得到了这个输出:
18446744073709551614 1
--------------------------------
Process exited after 15.61 seconds with return value 0 |
|