嚎叫一声  
让我尝试写一些opengl的东西吧
公告
日历
<2005年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678
统计
  • 随笔 - 71
  • 文章 - 0
  • 评论 - 201
  • 引用 - 0

导航

与我联系

搜索

 

常用链接

留言簿(17)

我参与的团队

随笔分类

随笔档案

相册

blog

links

宠物

积分与排名

  • 积分 - 51999
  • 排名 - 804

最新评论

阅读排行榜

评论排行榜

 

百度之星程序设计大赛
试题

第一题(共四题100分):连续正整数(10分)
题目描述:一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+615=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
输入数据:一个正整数,以命令行参数的形式提供给程序。

输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。

例如,对于15,其输出结果是:
  1 2 3 4 5
  4 5 6
  7 8
 
对于16,其输出结果是:
  NONE

评分标准:程序输出结果是否正确。

我的程序:

#include <stdio.h>
#include 
<math.h>

void show(int a1, int n)
{
    
int i;
    printf(
"%d", a1);
    
for (i = 1; i < n; i++)
    
{
        printf(
" %d", a1 + i);
    }

    printf(
"\n");
}


int main(int argc, char** argv)
{
    
int x, n, a1;
    
int showed = 0;
    
if (argc != 2)
        
return -1;

    
if (sscanf(argv[1], "%d"&x)!=1)
        
return -1;

    x 
= x*2;
    
// n(1+n)/2 = x
    n = (int)sqrt(x); // a*b = c^2 then a <= c <= b, so n <= sqrt(2x) <= n+1
    for(; n >= 2; n--)
    
{
        
if (x % n)
            
continue;

        a1 
= x / n - n + 1;
        
if (a1 % 2 == 0)
        
{
            a1 
/= 2;
            show(a1, n);
            showed 
= 1;
        }

    }

    
if (showed == 0)
        printf(
"NONE\n");
    
return 0;
}
posted on 2005-09-21 19:44 kaikai 阅读(1642) 评论(5)  编辑 收藏 所属分类: 算法与竞赛
评论:
  • #1楼   5min [未注册用户] Posted @ 2006-05-24 15:33
    如果 n 为偶数,那么当 x%n!=0&&x*2%n==0 时也是可以的
    从 x/n+0.5-n/2 开始的 n 个整数相加即是 x   回复  引用    

  • #2楼   5min [未注册用户] Posted @ 2006-05-24 15:35
    呵呵,少看了一段,原来计算前就把 X 增加了一倍   回复  引用    

  • #3楼   8086 [未注册用户] Posted @ 2006-05-25 00:25
    我昨天刚学完C,水平甚差,希望高手可以对以下程序予以点评,谢谢。

    #include<stdio.h>

    void print(int a,int b)
    {
    int i;
    for(i=a;i<=b;i++)
    printf("%d ",i);
    printf("\n");
    }

    int sum(a,b)
    {
    int s=0,i;
    for(i=a;i<=b;i++)
    s+=i;
    return s;
    }

    main()
    {
    int x,a,b,flag=0,i=0,s=0;
    scanf("%d",&x);
    while(s<x)
    {
    i++;
    s+=i;
    }
    if(s==x)
    {
    a=1;
    b=i;
    flag=1;
    print(a,b);
    }
    else
    {
    s-=i;
    a=1;
    b=i-1;
    }
    while(2*b<x)
    {
    a++;
    s=sum(a,b);
    while(s<x)
    {
    b++;
    s+=b;
    }
    if(s==x)
    {
    flag=1;
    print(a,b);
    }
    else
    b--;
    }
    if(!flag)printf("NONE");
    getch();
    }   回复  引用    

  • #4楼   chenmingqiang [未注册用户] Posted @ 2006-05-27 23:14
    #include<stdio.h>
    int a[1000][10000],b[1000]={0};
    int main()
    {
    int i,j,n;
    int count;
    while(scanf("%d",&n)==1)
    {
    count=0;
    for(i=1;;i++)
    if(i*(i+1)<2*n)
    {
    if((n-i*(i+1)/2)%(i+1)==0)
    {
    a[count][0]=(n-i*(i+1)/2)/(i+1);
    for(j=1;j<i+1;j++)
    a[count][j]=a[count][j-1]+1;
    b[count]=i+1;
    count++;
    }
    }
    else
    break;

    if(count==0)
    printf("NONE\n");
    else
    {
    for(i=count-1;i>=0;i--)
    {
    for(j=0;j<b[i];j++)
    printf("%d ",a[i][j]);
    printf("\n");
    }
    }
    }
    return 0;
    }
      回复  引用    

  • #5楼   toor [未注册用户] Posted @ 2006-11-19 22:47
    我刚开始学c++,这样下面做的不知道行不行
    #include<iostream>
    using namespace std;
    int main(){
    int n,sum=0;
    cin>>n;
    for(int i=1;i<=n/2;i++)
    {
    sum+=i;
    if(sum==n){
    for(int j=i;j<=sum;j++)
    cout<<j<<" ";
    cout<<endl;
    break;
    }
    if(sum>n){
    cout<<"NONE"<<endl;
    break;
    }
    }
    return 0;
    }
      回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-10-01 15:18 编辑过
 
 





 
Copyright © kaikai Powered by: 博客园 模板提供:沪江博客