标签:style blog http io color os ar for sp
http://blog.csdn.net/huahuahailang/article/details/8803939
题目:
我们知道:1+2=3;
4+5=9;
2+3+4=9;
等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式呢?
问题1. 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;
问题2. 有的数例如32就找不到这样的表达,这样的数字有什么规律?
问题3. 在64位正整数中,子序列数目最多的是哪一个?能否用数学知识推导出来?
#include<iostream> using namespace std; void AddNum(__int64 num) { __int64 k; __int64 i,t; __int64 j; int flag=-1; for (k=2;num>j;k++)//判断条件也可用sqrt(2*num),但是sqrt对64位的不好用。 { if (k%2==0) { j=(k/2)*(k-1);//这样判断是为了节省计算的时间,因为k*(k-1)/2比(k/2)*(k-1)更费时间 } else { j=((k-1)/2)*k; } if (((num-j)%k)==0) { flag=1; i=(num-j)/k; } if (flag==1) { printf("%I64d = ",num); for (t=0;t<k;t++) { printf("%I64d",i+t); if ((t+1)<k) { printf(" + "); } } flag=0; cout<<endl; } if ((k+1)%2==0) { j=((k+1)/2)*k; } else { j=(k/2)*(k+1); } } if (flag==-1) { printf("%I64d不可以表示成连续的自然数\n",num); } } void main() { __int64 num; cout<<"请输入一个64位正整数:"<<endl; //cin>>num; 编译出错,cin适合32位的 scanf("%I64d",&num); AddNum(num); }
。。。。。
设64位数中最大的子序列数位X。有k个子序列。
则X=1+2+3+。。。。+K=K*(1+K)/2
8位数:k*(k+1)/2 <0xFF 得到方程: k^2 + k -512 < 0 ,解方程得 k <22.13. 取k=22. 从1+2+。。。+22就可以得到想要得到的数。
对于64位的数。同样利用上面的方程:k*(k+1)/2 <0xFFFFFFFFFFFFFFFF 得到方程: k^2 + k - (2*0xFFFFFFFFFFFFFFFF) < 0.
解方程得到: k <=6074000999 则num= 18446744070963499500
标签:style blog http io color os ar for sp
原文地址:http://www.cnblogs.com/juandx/p/4066171.html