zoukankan      html  css  js  c++  java
  • 算法之连续整数之和

    首先以,1000为例

    设这组数的平均数为X,个数为N。
    
    
    1.当N为奇数时,X为整数。( X等于N个数中的中位数 )此时,N是1000的因数中的奇数,共计有N=1,N=5,N=25,N=125四种,则对应的X分别为X=1000,200,40,8;
    2.当N为偶数是,X为小数位为0.5的小数,那么2X是个奇数,令2X=Y,则有N*Y=2000,此时,Y是2000的因数中的奇数共计有Y=1,5,25,125四种,则对应的N为2000,400,80,16。X=0.5,2.5,12.5,62.5
    所以一共有8组连续整数之和等于2000。
    N=1时,1000;
    N=5时,198,199,200,201,202
    N=25时,28,29,。。。,40,。。。,51,52
    N=125时,-54,-53,。。。,8,。。。,69,70
    N=16时,55,56,。。。,62,63,。。。,69,70
    N=80时,-27,-26,。。。,12,13,。。。51,52
    N=400时,-197,-196,。。。,2,3,。。。,201,202
    N=2000时,-999,-998,。。。,0,1,。。。999,1000

    上面的分析方法含有负数的分组。
    如果考虑只有连续的正整数,该如何处理呢?
    一个正整数M,最长的连续整数的个数是:从1开始 n(n+1)/2 = M;其中n就是和为M的最长的连续整数的长度。n <= sqrt(2*M)
    所以在要使全部为正整数的话,就要保证所有的分组中,每一组中正整数的个数不超过n

    在第一种情况下,找到N<=n的个数c1;
    在第二种情况下,找到2N/Y <= n的个数 c2;
    最终结果 C1+C2;

    在这里贴出自己最近的一道题目以及个人解题

    ★实验任务
    大部分的正整数可以表示为2 个以上连续整数之和。例如

    6 = 1 + 2 + 3

    9 = 5 + 4=2+3+4
    现在要求计算给定的正整数可以表示为多少个2 个以上连续整数之和(即有多少种划分方案)。
    ★数据输入
    输入数据只有一行,一个正整数N(1<=N<=1000)。
    ★数据输出
    输出相应的连续整数分解方案的个数。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 int main()
     5 {
     6     int i = 1,N,count=0;
     7     scanf("%d",&N);
     8     int max = (int)(sqrt(2*N));
     9     while(i < N){ //组数为奇数
    10         if(i%2==1 && N%i==0 && N/i<=max ){
    11             count++;}
    12         i++;
    13     }
    14     i = 0;
    15     while(i<2*N){
    16         if(i%2==1 && 2*N%i==0 && 2*N/i<=max ){
    17             count++;}
    18         i++;
    19     }
    20     printf("%d
    ",count);
    21     return 0;
    22 }

    转载请标注 http://home.cnblogs.com/u/plxx/

     
  • 相关阅读:
    easy_install
    do some projects in macine learning using python
    awesome-scala
    val, lazy, def
    Scala命令设置JVM参数的规则
    CMMI-4中19个PA的大致描述
    项目管理中的十一个原则
    php代码在服务器中查看接值
    PHP进程锁
    解决百度网盘(百度云)分享链接不存在失效、分享的文件已经被取消的问题
  • 原文地址:https://www.cnblogs.com/plxx/p/3995548.html
Copyright © 2011-2022 走看看