c语言提问:求正整数x到y的最小步数(0<=x<y<=2^31)

我描述一下问题,说实话我都花好大劲才懂。
求正整数x到y的最小步数(0<x<y<2^31): 第一步和最后一步的步长必须是1。以后每一步步长必须和前一步步长相等,或者多1,或者少1。

我给点例子:
55到59 最少3步:1, 2, 1
55到60 最少4步:1,2,1,1 或者 1,1,2,1 (不可以1,3,1,违反了规则)
55到61 最少4步:1,2,2,1 (不可以1,4,1,这违反了规则)

用C或者C++求解 500 1000的最小步长。
谁能求解呢?给点想法也可以。很急,最好今天答案。多谢多谢!!!!!!!!!!

差 分解
1 1

2 1 1
3 1 1 1

4 1 2 1
5 1 2 1 1
6 1 2 2 1
7 1 2 2 1 1
8 1 2 2 2 1

9 1 2 3 2 1
10 1 2 3 2 1 1
11 1 2 3 2 2 1
12 1 2 3 3 2 1
13 1 2 3 3 2 1 1
14 1 2 3 3 2 2 1
15 1 2 3 3 3 2 1
16 1 2 3 4 3 2 1
从分解中可以看出,分解的数中最大的数(最大步长)为对差值求根号,并取整(如sqrt(10)=3),假设这个值为n,
对于差值为n*n的这个差值(9),分解后的形式就是1 2 3...n...3 2 1,这个步数为2*n-1(例如9的步长为5),这个是基本的步数;
继续往下,差值大于n*n+0*n,小于n*n+1n步数就加1,
(如10大于3*3+0,小于3*3+3,所以10的步数为5+1=6)
差值大于n*n+1*n,小于n*n+2*n步数就加2,
(如13,大于3*3+1*3,小于3*3+2*3,步数为7)
.....

以后遇到这种问题,果断的多写几个例子出来,慢慢分析.

#include<stdio.h>
#include<math.h>
int main(void)
{
int x,y;
int nStep=0;//步数
int nMax;//最大的步长
int m;//y-x与nMax平方的差
scanf("%d %d",&x,&y);
nMax=(int)(sqrt(y-x));

nStep=2*nMax-1;//基本步长

m=(y-x)-nMax*nMax;
nStep=nStep+(m+nMax-1)/nMax;//每多一个nMax,步长加1

printf("最小的步数为:%d\n",nStep);

return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-09-25
第一,明确最小步长一定是让中间几步尽可能大。
然后容易得出影响步长的关键数据num
=(大数-小数)/2
令1+2+3……在小于num的前提下得出序列的最大值max。
然后num-max的剩余值如果等于max+说明中间还差一步更大的值,即max+1,且刚好用完所有值。即步数=2*max+1。

如果不等则须插两个小于等于max的值。即步数等于2*max+2。

我要睡觉了。直接给你函数算了

int fun(int beginNum, int endNum)
{
int max = 1;
int sum = 2*max;
int num = endNum-beginNum;
while(sum < num)
{
sum+=2*(max++);
}
if(max == sum - num)
return 2*max-1;
else return 2*max;
}

睡去了,代码没跑,不过估计问题不大
第2个回答  2010-09-25
我觉得这好比一个金子塔
1
1 1 1
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
而仔细点看就只有一半了,将两边1加起来就是2,4,6,8....之后就成了多个偶数再加上最顶上(也就是最中间那一排)一个奇数或两个偶数求和的sum要等於1000-500,可以在快到得时候加一个判断比500大或者下,然后处理一下边界问题就可以了。细的程序就不说了,我下班回家了
第3个回答  2010-09-25
对不起 问题没有说明白

c语言提问:求正整数x到y的最小步数(0<=x<y<=2^31)
nStep=2*nMax-1;\/\/基本步长 m=(y-x)-nMax*nMax;nStep=nStep+(m+nMax-1)\/nMax;\/\/每多一个nMax,步长加1 printf("最小的步数为:%d\\n",nStep);return 0;}

用C语言编程:输入x,y,z三个数,输出最大值和最小值
include<stdio.h>int main(){int x,y,z,t; scanf("%d%d%d",&x,&y,&z); if(x<y){t=x;x=y;y=t;} if(x<z){t=x;x=z;z=t;} if(y<z){t=y;y=z;z=t;} printf("max=%d min=%d\\n",x,z); return 0;}

c语言编程:输入两个正整数,求最大公约数和最小公倍数
printf("它们的最小公约数为:%d\\n",p\/n);return 0;} 方法二、\/\/穷举法解两个数的最大公约数和最小公倍数 void exp(int num1,int num2){ int x,y,i;x=num1;y=num2;int max=0;\/\/最大公约数 for(i=1;i<=num1;i++)if(num1%i==0&&num2%i==0)max=i;System.out.println(...

c语言求x到y的奇数和
1、首先需要新建一个 求小于100的奇数的平方和 项目。2、然后在打开的项目中添加一个 square.c 文件,如图所示。3、然后包含stdio.h和stdlib.h头文件。4、输入main函数主体及返回值。5、使用for语句进行计算。6、运行程序,输出计算后的结果,如图所示。

c语言编写两个自定义函数,分别实现求两个整数的最大公约数和最小公倍...
printf("HCF is%d LCM is%d\\n",hcf,lcm);\/\/输出最大公约数和最小公倍数 system("pause");return 0;} int sum;\/\/定义外部变量sum \/\/最大公约数函数 int HCF(int x,int y){ int i,k,m,n;sum=1;k=x>y?y:x;i=2;while(i<=k){ m=x%i;n=y%i;if(m==0&&n==0){ sum*...

C语言中 main() {int x=1,y=1,z=0; if(z<0) if(y>0 具体请看下边程序...
C语言中 main() {int x=1,y=1,z=0; if(z<0) if(y>0 具体请看下边程序。由于刚刚学习这门语言,请指教 main(){intx=1,y=1,z=10;if(z<0)if(y>0)x=3;elsex=5;printf(''%d\\t'',x);if(z=y<0)x=3;else... main() {int x=1,y=1,z=10; if(z<0) if(y>0) x=3;else...

C语言:输入一个实数x,求其绝对值y。 #include<stdio.h>?
include<stdio.h> void main(){ float x,y;scanf("%f",&x);y=x;if(x<0) y=-x;printf("x=%f y=%f\\n",x,y);}

【c语言】本题要求对任意给定的正整数N,求方程X^2+Y^2=N的全部正整数...
因为在上一次循环里面y值已经改变 也就是说除了第一次的x循环里面,y都是从n开始的,当然不对 要改成注释里面的,那每次把y初始化为1就行了 for(y=1;y<n;y++)

随机变量(X,Y)在区域:0<x<1,x^2<y<x上服从均匀分布。(1)求(X,Y)的...
~如果您认可我的回答,请及时点击【采纳为满意回答】按钮~~手机提问者在客户端上评价点【满意】即可~~~您的采纳是我前进的动力~~~如还有问题,可以追问~~~祝学习进步,更上一层楼!O(∩_∩)O~

简单C语言题:求x²+y²=1000,所有正整数的解:
if((int)x==x)printf("x=%lf,y=%lf\\n",x,y);} return 0;} 如果你真的想用代码%d的话你可以这么写 代码如下:include<stdio.h> include<math.h> int main(){ double x,y;for(y=0;y>=0&&y<=31;y++){ x=sqrt(1000-pow(y,2));if((int)x==x)printf("x=%d,y=%d\\n"...

相似回答