题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
1:一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否则就是以a+1开头的连续n-1个整数了,也就是要求(M-n*(n-1)/2)%n==0,这样就很容易判断一个数可不可以写成连续n个自然数的形式了,遍历n=2…sqrt(M)*2,还可以输出所有解。
2:什么样的数可以写成连续n个自然数之和,什么样的数不能?
通过编程实验发现,除了2^n以外,其余所有数都可以写成该形式。下面说明为什么。
若数M符合条件,则有M=a+(a+1)+(a+2)+…+(a+n-1)=(2*a+n-1)*n/2,而2*a+n-1与n肯定一个为奇数一个为偶数,即M一定要有一个奇数因子,而所有2^n都没有奇数因子,因此肯定不符合条件。
再证明只有M有一个奇数因子,即M!=2^n,M就可以写成连续n个自然数之和。假设M有一个奇数因子a,则M=a*b。
- 若b也是奇数,只要b-(a-1)/2>0,M就可以写成以b-(a-1)/2开头的连续a个自然数;将这条结论里的a和b调换,仍然成立。15=3*5=1+2+3+4+5=4+5+6.
- 若b是偶数,则我们有一个奇数a和一个偶数b。
- 2.1 若b-(a-1)/2>0,M就可以写成以b-(a-1)/2开头的连续a个自然数。24=3*8=7+8+9.
- 2.2 若(a+1)/2-b>0,M就可以写成以(a+1)/2-b开头的连续2*b个自然数。38=19*2=8+9+10+11.
上述两个不等式必然至少有一个成立,所以可以证明,只要M有一个奇数因子,就一定可以写成连续n个自然数之和。
//上面是理论 判断可以用;
另一个正整数分解的算法:
sum(i,j)为i累加到j的和
令 i=1 j=2
if sum(i,j)>N i++
else if sum(i,j)<N j++
else cout i...j
--------------------------------------
//跟汝佳老师学了好几手 比如我要输出100000以内一个数的 的生成元并且输出很多
我为什么要对于每一个找呢 反正100000位数的生成元我可以直接用100000以内的数来求算 我直接枚举生成元打成表 线性时间就把生成元所生成的数和生成元对应起来了好处大大的有 所以说要寻找到一种简单可行的方法对于问题优化;
---------------------------------------环可以用模来模拟;
---------------------------------------
int getv(int row, int col, int max_row, int max_col) // row < max_row, col < max_col
{
int level = min(min(row, max_row - 1 - row), min(col, max_col - 1 - col));
int distance = row + col - level * 2;
int start_value = 2 * level * (max_row + max_col - 2 * level) + 1;
if (row == level || col == max_col - 1 - level ||
(max_col < max_row && level * 2 + 1 == max_col))
return start_value + distance;
int next_value = start_value + (max_row + max_col - 4 * level - 2) * 2;
return next_value - distance;
}
螺旋矩阵的性质吼吼 好好看看算法 直接由坐标来写count;
---------------------------------
做阶乘的题目的时候 一定要看看是否中间结果溢出 这是非常重要的。
---------------------------------
#include <stdio.h>
char s[]="#include <stdio.h>%cchar s[]=%c%s%c;%cint main(){printf(s,10,34,s,34,10,10);}%c";
int main() {printf(s,10,34,s,34,10,10);};}
//如果只用普通的调用肯定不能行 那样会陷入无限递归 但是我们如果能自己递归自己就把问题解决了 printf可以不用管 关键是字符串 字符串写了程序框架,第一次把程序框架输出 而第二次输出本身存在于框架之中的字符串 ;记住 数学才是王道