解题思路:
根据求和公式,m=n*(n+1)/2,知道m逆求n,n大概等于根号下(m*2),演算一下,不是就+1。
n*(n+1)/2可以写成(n*-~n>>1)
>>1是二进制右移,相当于/2
~n=-n-1,-~n=n+1
使用二进制可以加快运行速度
以上。
参考代码:
#include <iostream> #include <cmath> using namespace std; int main() { int n,m; cin>>m; n=sqrt(m*2); if((n*-~n>>1)>=m){ cout<<n; }else{ cout<<n+1; } return 0; }
0.0分
155 人评分
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:641 |
C语言训练-排序问题<1> (C语言代码)浏览:636 |
母牛的故事 (C语言代码)浏览:992 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:539 |
哥德巴赫曾猜测 (C语言代码)浏览:2561 |
简单的a+b (C语言代码)浏览:626 |
简单的a+b (C语言代码)浏览:529 |
DNA (C语言代码)浏览:440 |
核桃的数量 (C语言代码)浏览:893 |
C语言训练-亲密数 (C语言描述,反正怎么都能对)浏览:2256 |