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>=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为偶数的时候有一定近似
http://topic.csdn.net/u/20080628/17/494e2c0d-dc9b-42fe-9c4a-31487407b919.html?seed=281273408
题目描述:一个正整数有可能可以被表示为 n(n>=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
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>=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为偶数的时候有一定近似
http://topic.csdn.net/u/20080628/17/494e2c0d-dc9b-42fe-9c4a-31487407b919.html?seed=281273408
题目描述:一个正整数有可能可以被表示为 n(n>=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
unsigned long static bak = 0;
为什么要 static
#6
不晓得有没更快的算法。。。期待中