标题:求大神优化程序,就是能不能不用穷举。用其他的方法能不能做出来
只看楼主
百里
Rank: 2
等 级:论坛游民
帖 子:34
专家分:66
注 册:2016-10-1
结帖率:100%
已结贴  问题点数:10 回复次数:16 
求大神优化程序,就是能不能不用穷举。用其他的方法能不能做出来
编写程序求以下算式中XYZ的值,其中两数XYZ与YZZ相加的和n(99<n<1000)的值要求从键盘输入。


程序运行结果示例1:
Input n(n<1000):
532↙
X=3,Y=2,Z=1

程序运行结果示例2:
Input n(n<1000):
977↙
Invalid
///////////////////以下是希望能被修改的源程序////////////////
#include"stdio.h"
void  reduction(int n);
int main()
{
    int n;
    printf("Input n(n<1000):n");
    scanf( "%d" , & n);
    reduction(n);
    return 0;
}
void reduction(int n)
{
    int X, Y ,Z, t, k,flag=0;
    for(X=1;X<=9;X++)
        {
            for(Y=0;Y<=9;Y++)
                {
                    for(Z=0;Z<=9;Z++)
                        {
                            t=X*100+Y*10+Z;
                            k=Y*100+Z*10+Z;
                            if(t+k==n)
                            {
                                printf("X=%d,Y=%d,Z=%dn",X , Y , Z);
                                flag=1;
                                break;
                            }
                        }
                }
        }
        if(!flag)
        {
            printf("Invalidn");
        }
 }

搜索更多相关主题的帖子: 编写程序 include return 源程序 键盘 
2016-10-16 11:15
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:2 
其他的方法我没想出来,但是可以减少你穷举的次数
void reduction(int n)
 {
     int X, Y ,Z, t, k,flag=0;
     for(X=1;X<=9;X++)  //for(X=1;X<n%100;X++)
         {
             for(Y=0;Y<=9;Y++)  //for(Y=0;Y<=n/10%10;X++)
                 {
                     for(Z=0;Z<=9;Z++)  //for(Z=0;Z<=n%10;Z++)
                         {
                             t=X*100+Y*10+Z;
                             k=Y*100+Z*10+Z;
                             if(t+k==n)
                             {
                                 printf("X=%d,Y=%d,Z=%dn",X , Y , Z);
                                 flag=1;
                                 break;
                             }
                         }
                 }
         }
         if(!flag)
         {
             printf("Invalidn");
         }
  }

早知做人那么辛苦!  当初不应该下凡
2016-10-16 13:31
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:2 
#include"stdio.h"
void  reduction(int n);
int main()
{
    int n;
    printf("Input n(n<1000):n");
    scanf( "%d" , & n);
    reduction(n);
    return 0;
}
void reduction(int n)
{
    int y,a,b,c;
    a=n/100;
    b=(n-100*a)/10;
    c=n%10;
    if(c%2)
    {
        printf("Invalidn");
        return 0;
    }
    for(y=0;y<=9;y++)
    {
        if((32*a+2*b-c-34*y)%32==0&&(10*b+11*c-10*y)%32==0)
               {
                printf("x=%d,y=%d,z=%d",(32*a+2*b-c-34*y)/32,y,(10*b+11*c-10*y)/32);
                return 0;      
               }
    }
    if(y>9)
    printf("Invalidn");
       return 0;   
 }
楼主以什么理由定下x一定要大于0呢。如果说x要大于才是xyz,那么y也要大于0才是。基于这个理由,我假设x,y可以为0。
2016-10-16 17:13
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:2 
编了一个,不知道有没有漏掉的。
#include<stdio.h>
 void main()
 {
    int x,y,z,m,a,b;
    printf("input m(100-999):\n");
    scanf("%d",&m);
    b=m;
    a=m%10;
    m/=10;
    z=a/2;
    y=m%10-z;
    m/=10;
    x=m-y;
    if(x*100+y*10+z+y*100+z*10+z==b&&x!=0&&y!=0)
    printf("%d %d %d",x,y,z);
    else
    printf("invalid\n");
 }
2016-10-16 17:19
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:0 
以下是引用ehszt在2016-10-16 17:19:19的发言:

编了一个,不知道有没有漏掉的。
#include<stdio.h>
 void main()
 {
    int x,y,z,m,a,b;
    printf("input m(100-999):\n");
    scanf("%d",&m);
    b=m;
    a=m%10;
    m/=10;
    z=a/2;            //难道z一定要小于5,能说下理由吗
    y=m%10-z;        
    m/=10;
    x=m-y;            //为什么x一定要等于m-y,难道说y也一定小于5吗
    if(x*100+y*10+z+y*100+z*10+z==b&&x!=0&&y!=0)
    printf("%d %d %d",x,y,z);
    else
    printf("invalid\n");
 }

2016-10-16 17:29
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:0 
楼主的题目
X Y Z
Y Z Z
------
Z一定小于5
Y不一定小于5

早知做人那么辛苦!  当初不应该下凡
2016-10-16 18:26
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 5楼 linlulu001
不好意思,确实不行,我只能用穷举法。
不过你的程序还是有问题。return 0改过来后,你试试输入582,你的结果得出了负数。
下面是我修改后的程序,应该稍微简单些:
#include"stdio.h"
 void  reduction(int n);
 int main()
 {
     int n;
     printf("Input n(n<1000):\n");
     scanf( "%d" , & n);
     reduction(n);
     return 0;
 }
 void reduction(int n)
 {
     int X, Y ,Z, t, k,flag=0;
     for(X=1;X<=9;X++)
         {
             for(Y=1;Y<=9;Y++)
                 {
                     for(Z=0;Z<=9;Z++)
                         {
                             if(100*X+110*Y+12*Z==n)
                             {
                                 printf("X=%d,Y=%d,Z=%d\n",X , Y , Z);
                                 flag=1;
                                 break;
                             }
                             else if(100*X+110*Y+12*Z>n)
                             break;
                         }
                 }
         }
         if(!flag)
         {
             printf("Invalid\n");
         }
  }
2016-10-16 19:05
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 6楼 炎天
这倒不一定,例如:582=416+166。
2016-10-16 19:07
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:0 
仔细想想,我的也不对,我的也没有计算进位的情况,所以我的代码也是错的。
#include <stdio.h>

int main()
{
    int x,y,n;
    scanf("%d",&n);
    if((n%10)%2)
    {
        printf("Invalid\n");
        return 0;
    }
    for(x=0;x<=n/100;++x)
        for(y=0;y<=n/100-x;++y)
        {
            if(100*x+110*y+12*(n%10/2)==n)
                    {
                        printf("x=%d y=%d z=%d\n",x,y,n%10/2);
                        return 0;
                    }
            if(100*x+110*y+12*(n%10+10)/2==n)
                {
                        printf("x=%d y=%d z=%d\n",x,y,(n%10+10)/2);
                        return 0;
                }
        }
    printf("Invalid\n");
    return 0;
}
我目前只能优化到这一步。让大神进一步优化吧。

[此贴子已经被作者于2016-10-16 20:30编辑过]

2016-10-16 19:33
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:2 
//大神们,测试一下这个是不是对的

#include <stdio.h>

void reduction(int n)
{
    int X, Y ,Z;
    int g,nY;
    int zz[2];
    if(n%2==1){
        printf("Invalidn\n");
        return;
    }
    n=n/2;
    g = n%10;
    zz[0] = g;
    zz[1] = (g+10)%5;
    int zindex;
    for(zindex=0;zindex<2;zindex++){   //只需循环两次即可求出解
        Z = zz[zindex];
        nY = (n-Z)/5-Z;
        Y = nY%10;
        X = (nY-11*Y)/10;

        if(X>0 && Y>=0 && Z>=0)
            printf("X=%d,Y=%d,Z=%d\n",X , Y , Z);
    }
 }

int main()
{
    int n;
    printf("Input n(n<1000):n");
    scanf( "%d",&n);
    reduction(n);
    return 0;
}
2016-10-16 22:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-469847-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.509187 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved