帮看看这样做有什么问题没?有没更好办法?

时间:2021-12-08 21:22:34
/*一个正整数有可能可以被表示为n(n>=2)个连续正整数之和《如:
  15 = 1+2+3+4+5
  15=4+5+6;
  15=7+8;
*/

main()
{
    unsigned long i = 0 , j = 0;
unsigned long input;

unsigned long static bak = 0;

printf("please input a intger:\n");
scanf("%d",&input);

for(i=2;i<input;i++)
{
bak += i-1;
for(j=0;j<input;j++)
{
if(input == (i*j + bak))
{
printf("\n\n ---------------------------\n");
printf("continue number :%d\n",i);
printf("the first continue number:%d\n",j);
printf(" ---------------------------\n\n");
}
}
}

        printf("the number no devide\n");
}      

6 个解决方案

#1


呵,题目比较老了,看下面的吧...

http://topic.csdn.net/u/20080628/17/494e2c0d-dc9b-42fe-9c4a-31487407b919.html?seed=281273408
题目描述:一个正整数有可能可以被表示为 n(n&gt;=2) 个连续正整数之和,如: 

15=1+2+3+4+5 
15=4+5+6 
15=7+8 

请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。 

输入数据:一个正整数,以命令行参数的形式提供给程序。 

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

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


题目是05年百度之星的第一题,难倒是不难,但是以下的解法完全看不懂……有达人详细解释一下吗? 


C/C++ code#include<iostream>
#include<cmath>

using namespace std;

int main()
{
  bool flag=0;
  int max;        
  long m,start,end;   
  float temp;     
  //max 表示拆分后的最多个数
  //flag为0或1 (0 表示无符合条件的序列存在,1表示有)
  //m 表示要处理的输入数据
  //start 表示要显示的开始数字
  //end 表示要显示的结束数据
  
  cin>>m;         
  max = sqrt(m*2);

  //计算 最多有多少个连续的数相加等于 m

  for(;max >= 2;max--)
  {
    temp = (float)m/max - (float)(max-1)/2;

    //计算开始的数字是否为整数

    if(temp == (int)temp)  //判断是否为整数
    {    

      flag = 1;         //置标志为1,表示输入的数据有符合条件的序列存在
      start = temp;            //置要显示的开始正整数
      end = start + max;        //置要显示的结束正整数

      for(;start < end;start++)    //显示由 start 到 end 的连续正整数
          {
                 cout<<start;
                 cout<<" ";
          }
          cout<<endl;
    }
  }
  if(flag == 0)    //判断处理的数据是否有符合条件的序列存在
      cout<<"NONE\n";    

  cin.get();
  cin.get();

}

max = sqrt(m*2); 
最多的就是从1加到k 
于是 
(1+k)*k/2 = m; 
sqrt(m*2)就是为了计算k 

for(;max >= 2;max--) 
  { 
    temp = (float)m/max - (float)(max-1)/2; 
计算划分为max的时候的第一个数 
比如max = 3,且能分为三个连续整数的和 
m/max 就是中间那个数 
再送去(max-1)/2就是第一个数了 

当然max为偶数的时候有一定近似

#2


我觉得它做得很负责,上面是我自己写的。

#3


路过~~

#4



#include <stdio.h> 

int main(){
int num;
printf("Input a Number");
scanf("%d",&num);
int i;
for(i=1;i<num/2+1;i++)
{
int j=i,sum=0;
while(sum<num){
sum+=j;
j++;
}
if(sum==num){
int t;
j--;
for(t=i;t<=j;t++)
printf("%d  ",t);
printf("\n");
}
}
return 0;
}

#5


引用 2 楼 raowangcheng 的回复:
我觉得它做得很负责,上面是我自己写的。

unsigned long static bak = 0; 
为什么要 static 

#6


不晓得有没更快的算法。。。期待中

#1


呵,题目比较老了,看下面的吧...

http://topic.csdn.net/u/20080628/17/494e2c0d-dc9b-42fe-9c4a-31487407b919.html?seed=281273408
题目描述:一个正整数有可能可以被表示为 n(n&gt;=2) 个连续正整数之和,如: 

15=1+2+3+4+5 
15=4+5+6 
15=7+8 

请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。 

输入数据:一个正整数,以命令行参数的形式提供给程序。 

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

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


题目是05年百度之星的第一题,难倒是不难,但是以下的解法完全看不懂……有达人详细解释一下吗? 


C/C++ code#include<iostream>
#include<cmath>

using namespace std;

int main()
{
  bool flag=0;
  int max;        
  long m,start,end;   
  float temp;     
  //max 表示拆分后的最多个数
  //flag为0或1 (0 表示无符合条件的序列存在,1表示有)
  //m 表示要处理的输入数据
  //start 表示要显示的开始数字
  //end 表示要显示的结束数据
  
  cin>>m;         
  max = sqrt(m*2);

  //计算 最多有多少个连续的数相加等于 m

  for(;max >= 2;max--)
  {
    temp = (float)m/max - (float)(max-1)/2;

    //计算开始的数字是否为整数

    if(temp == (int)temp)  //判断是否为整数
    {    

      flag = 1;         //置标志为1,表示输入的数据有符合条件的序列存在
      start = temp;            //置要显示的开始正整数
      end = start + max;        //置要显示的结束正整数

      for(;start < end;start++)    //显示由 start 到 end 的连续正整数
          {
                 cout<<start;
                 cout<<" ";
          }
          cout<<endl;
    }
  }
  if(flag == 0)    //判断处理的数据是否有符合条件的序列存在
      cout<<"NONE\n";    

  cin.get();
  cin.get();

}

max = sqrt(m*2); 
最多的就是从1加到k 
于是 
(1+k)*k/2 = m; 
sqrt(m*2)就是为了计算k 

for(;max >= 2;max--) 
  { 
    temp = (float)m/max - (float)(max-1)/2; 
计算划分为max的时候的第一个数 
比如max = 3,且能分为三个连续整数的和 
m/max 就是中间那个数 
再送去(max-1)/2就是第一个数了 

当然max为偶数的时候有一定近似

#2


我觉得它做得很负责,上面是我自己写的。

#3


路过~~

#4



#include <stdio.h> 

int main(){
int num;
printf("Input a Number");
scanf("%d",&num);
int i;
for(i=1;i<num/2+1;i++)
{
int j=i,sum=0;
while(sum<num){
sum+=j;
j++;
}
if(sum==num){
int t;
j--;
for(t=i;t<=j;t++)
printf("%d  ",t);
printf("\n");
}
}
return 0;
}

#5


引用 2 楼 raowangcheng 的回复:
我觉得它做得很负责,上面是我自己写的。

unsigned long static bak = 0; 
为什么要 static 

#6


不晓得有没更快的算法。。。期待中