标题:学校oj上的问题 实在不知道哪里错了 大佬们能帮我解决一下吗?
只看楼主
Emmaer123
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2019-9-20
结帖率:66.67%
已结贴  问题点数:20 回复次数:6 
学校oj上的问题 实在不知道哪里错了 大佬们能帮我解决一下吗?
#include<stdio.h>
int main()
{
    int a,b,c,i,r=1,x,y,z,p,k,m[10];
    int t=0,q=0;
    scanf("%d%d%d",&x,&y,&z);
   
    for(i=1;i<978;i++)
    {
        a=x*i;b=y*i;c=z*i;
        m[0]=a%10;m[1]=a/10%10;m[2]=a/100;m[3]=b%10;m[4]=b/10%10;m[5]=b/100;m[6]=c%10;m[7]=c/10%10;m[8]=c/100;
        
        for(int j=0;j<9;j++)  
           {   if(  m[j]==0 )    {q=1;}    }   //第一次筛选:m数组存放三个三位数的数字,检查是否有0   
           
        if(q==1)  continue;
        if(q==0)       //第二次筛选:没有零的情况下,检查九个数字中有无重复的数字
        {
            for(p=0;p<8;p++)
             {
                for(k=p+1;k<9;k++)
                 {
                   if(m[k]==m[p])  { r=0;} //有重复的数字,那么r=0
                 }
            }
            
            if(r==0)  continue; //如果r=0进行下一轮重复
            else       { t=1;printf("%d  %d  %d\n",a,b,c); }  // 有符合标准的三个数,t=1
       }
    }
   
    if(t==0) printf("No!!!");//最后t=0说明一直没有符合标准的三个数
    return 0;
}

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
输入格式      
三个数,A B C

输出格式
若干行,每行3个数字。按照每行第一个数字升序排列。

输入输出样例
输入 #1
1 2 3

输出 #1
192 384 576
219 438 657
273 546 819
327 654 981


[此贴子已经被作者于2019-11-11 18:22编辑过]

搜索更多相关主题的帖子: 个数 输出 for 位数 数字 
2019-11-10 20:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
实在不知道哪里错了
你连“样例”都不符合
2019-11-11 08:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
根据你的代码修改而来
程序代码:
#include <stdio.h>
#include <stdbool.h>

int main( void )
{
    unsigned a,b,c;
    scanf( "%u%u%u", &a ,&b, &c );

    bool bfound = false;
    for( unsigned i=1; a*i<1000 && b*i<1000 && c*i<1000; ++i )
    {
        unsigned mark = 0;
        mark |= 1u<<(a*i%10);
        mark |= 1u<<(a*i/10%10);
        mark |= 1u<<(a*i/100);
        mark |= 1u<<(b*i%10);
        mark |= 1u<<(b*i/10%10);
        mark |= 1u<<(b*i/100);
        mark |= 1u<<(c*i%10);
        mark |= 1u<<(c*i/10%10);
        mark |= 1u<<(c*i/100);

        if( mark == 0x3FE )
        {
            bfound = true;
            printf( "%u %u %u\n", a*i, b*i, c*i );
        }
    }
    if( !bfound )
        puts( "No!!!" );
}

2019-11-11 09:16
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:0 
题目有点难,表示没找着头绪。
你这个程序有些毛病,我做了些注释,有问题请指出,相互学习。

程序代码:
#include<stdio.h>
int main()
{
    int a,b,c,i,r,x,y,z,l,t,j,m[10];  //表示预先定义一大串变量,并没有多大作用,写完程序后有些变量还是有可能未定义。定义变量最好分行。给变量分组,以便调试程序时,方便理解使用。
    scanf("%d%d%d",&x,&y,&z);
    
    for(i=1;i<978;i++)
    {
        a=x*i;b=y*2*i;c=z*i;            //b等于y*2*i?是写错了?
        
        m[0]=a%10;                      //虽然此处语句很多,但是最好分行写,以免出错。
        m[1]=a/10%10;
        m[2]=a/100;
        m[3]=b%10;
        m[4]=b/10%10;
        m[5]=b/100;
        m[6]=c%10;
        m[7]=c/10%10;
        m[8]=c/100;                 //分别计算a,b,c,的个位十位百位上的数,并赋值给数组m
        
        for(int j=0;j<9;j++)  
         {   if(  m[j]==0 )    break;    } //在数组m中找到第一个元素为0的j值,j的作用是?
        
        for(int p=0;p<9;p++)
        {
            for(int k=p+1;k<9;k++)
            {
                if(m[p]==m[k])  { r=0;break;}   //if语句执行后,r的值一直为0;之后的(r!=0)为假,不可能执行语句输出a,b,c的值。
            }
        
            if(r!=0)      
            { t=1;printf("%d  %d  %d\n",a,b,c); }
        }
        if(t!=1) printf("No!!!");      //t未初赋值,t有可能是任意值。程序输入1 2 3 运行结果是一大串No!!!No!!!No!!!No!!!等等等
    
   }
   return 0;                          //此处的return 0;最好加上,养成习惯。
}


[此贴子已经被作者于2019-11-11 16:40编辑过]

2019-11-11 16:31
Emmaer123
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2019-9-20
得分:0 
回复 4楼 bcbbcclbbc
谢谢你花费时间指正我代码的错误,我根据指出的错误作了改正,并附了一些注释
#include<stdio.h>
int main()
{
    int a,b,c,i,x,y,z,p,k,m[10];
    int t=0,q=0,r=1;
    scanf("%d%d%d",&x,&y,&z);
   
    for(i=1;i<978;i++)
    {
        a=x*i;b=y*i;c=z*i;
        m[0]=a%10;m[1]=a/10%10;m[2]=a/100;m[3]=b%10;m[4]=b/10%10;m[5]=b/100;m[6]=c%10;m[7]=c/10%10;m[8]=c/100;
        
        for(int j=0;j<9;j++)  
           {   if(  m[j]==0 )    {q=1;}    }   //第一次筛选:m数组存放三个三位数的数字,检查是否有0   
           
        if(q==1)  continue;
        if(q==0)       //第二次筛选:没有零的情况下,检查九个数字中有无重复的数字
        {
            for(p=0;p<8;p++)
             {
                for(k=p+1;k<9;k++)
                 {
                   if(m[k]==m[p])  { r=0;} //有重复的数字,那么r=0
                 }
            }
            
            if(r==0)  continue; //如果r=0进行下一轮重复
            else       { t=1;printf("%d  %d  %d\n",a,b,c); }  // 有符合标准的三个数,t=1
       }
    }
   
    if(t==0) printf("No!!!");//最后t=0说明一直没有符合标准的三个数
    return 0;
}



[此贴子已经被作者于2019-11-12 12:21编辑过]

2019-11-11 18:22
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:15 
回复 5楼 Emmaer123
算是弄懂了解题思路,作了些修改
少了两处,现在应该可以了,你试一试
程序代码:
#include<stdio.h>
int main()
{
    int x,y,z,a,b,c;
    int m[10],p,k;
    int q,r,t;
    //int e,f,g;
    //e=f=g=0;    //**循环计数。变量e,f,g调试时使用。
    
    a=b=c=0;    //**为a,b,c赋初值。
    scanf("%d%d%d",&x,&y,&z);
    for(int i=1;a<=999&&b<=999&&c<=999;i++)      //**条件:a,b,c都是三位数。(第一个)
    {
        q=0;
        r=1;                    //**循环所需判断值,每次循环后初始化。(第二个)
        
        a=x*i;b=y*i;c=z*i;
        
        m[0]=a%10;m[1]=a/10%10;m[2]=a/100;
        m[3]=b%10;m[4]=b/10%10;m[5]=b/100;
        m[6]=c%10;m[7]=c/10%10;m[8]=c/100;
        
        for(int j=0;j<9;j++)  
            if(m[j]==0)    q=1;      //第一次筛选:m数组存放三个三位数的数字,检查是否有0   
        //e++;      
           
        if(q==1)  continue;    //**既然q的值只有0和1,完全可以用一个if语句。而且可以if(q),非零为真。r和t也可以这样,简洁。
        //f++;
        if(q==0)       //第二次筛选:没有零的情况下,检查九个数字中有无重复的数字
        {
            for(p=0;p<8;p++)
             {
                for(k=p+1;k<9;k++)
                 {
                   if(m[k]==m[p])  { r=0;} //有重复的数字,那么r=0
                 }
            }
            
        //printf("%d,%d,%d,%d,%d\n",i,a,b,r,t);
            if(r==0)  continue; //如果r=0进行下一轮重复
            else       { t=1;printf("%d  %d  %d\n",a,b,c); }  // 有符合标准的三个数,t=1
       }
    }
    //printf("\n");
    //printf("%d,%d,%d,%d,%d,%d,%d,%d\n",i,j,q,r,t,a,b,c);
    //printf("%d,%d,%d\n",e,f,g);
    
    if(t==0) printf("No!!!");//最后t=0说明一直没有符合标准的三个数
    return 0;
}


[此贴子已经被作者于2019-11-12 10:02编辑过]

2019-11-12 10:00
Emmaer123
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2019-9-20
得分:0 
回复 6楼 bcbbcclbbc
谢谢,我运行您改正过的代码,结果是正确的,感谢抱拳
2019-11-12 12:14



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




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

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