您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> C语言 >> 辅导 >> 正文    
  C趣味程序百例(19)1~9组成三个3位的平方数 【注册男护士专用博客】          

C趣味程序百例(19)1~9组成三个3位的平方数

www.nanhushi.com     佚名   不详 

61.1~9组成三个3位的平方数    
    将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,要求每组中的三位数都组成一个平方数。
*问题分析与算法设计
    本问题的思路很多,这里介绍一种简单快速的算法。
    首先求出三位数中不包含0且是某个整数平方的三位数,这样的三位数是不多的。然后将满足条件的三位数进行组合,使得所选出的3个三位数的9个数字没有重复。
    程序中可以将寻找足条件的三位数的过程和对该三位数进行数字分解的过程结合起来。
*程序与程序注释
#include<stdio.h>
void main()
{
    int a[20],num[20][3],b[10];     /*a:存放满足条件的三位数*/
                                    /*若不是10 的倍数,则分解三位数*/
                                    /*分解该三位数中的每一个数字*/
    int i,j,k,m,n,t,flag;
    printf("The 3 squares with 3 different digits each are:\n");
    for(j=0,i=11;i<=31;i++)      /*求出是平方数的三位数*/
    if(i%10!=0)            /*若不是10的倍数,则分解三位数*/
    {
        k=i*i;             /*分解该三位数中的每一个数字*/
        num[j+1][0]=k/100;   /*百位*/
        num[j+1][1]=k/10%10;    /*十位*/
        num[j+1][2]=k%10;      /*个位*/
        if(!(num[j+1][0]==num[j+1][1]||num[j+1][0]==num[j+1][2]||
                            num[j+1][1]==num[j+1][2]))     /*若分解的三位数字均不相等*/
            a[++j]=k;      /*j:计数器,统计已找到的满足要求的三位数*/
    }
    for(i=1;i<=j-2;++i)     /*从满足条件的三位数中选出三个进行组合*/
    {
        b[1]=num[i][0];
        b[2]=num[i][1];
        b[3]=num[i][2];
        for(t=i+1;t<=j-1;++t)
        {
            b[4]=num[t][0];           /*取第t个数的三位数字*/
            b[5]=num[t][1];
            b[6]=num[t][2];
            for(flag=0,m=1;!flag&&m<=3;m++)     /*flag:出现数字重复的标记*/
                for(n=4;!flag&&n<=6;n++)      /*判断两个数的数字是否有重复*/
                    if(b[m]==b[n])flag=1;      /*flag=1:数字有重复*/


            if(!flag)
                for(k=t+1;k<=j;k++)
                {
                    b[7]=num[k][0];         /*取第k个数的三位数字*/
                    b[8]=num[k][1];
                    b[9]=num[k][2];
                    for(flag=0,m=1;!flag&&m<=6;m++)  /*判断前两个数字是否*/
                        for(n=7;!flag&&n<=9;n++)     /*与第三个数的数字重复*/
                            if(b[m]==b[n])flag=1;
                    if(!flag)             /*若均不重复则打印结果*/
                        printf("%d,%d,%d\n",a[i],a[t],a[k]);
                }
        }
    }
}
*运行结果
    The 3 squares with 3 different digits each are:
        361,529,784
*思考题
    将1、2、3、4、5、6、7、8、9九个数字分成二组,每个数字只能用一次,一组形成一个5位数,另一组形成一个4位数,使得前者为后者的n倍。求所有满足条件的5位数和4位数。(注意:N的最大值等于68,68以内的某些N也是不可能的。不可能的N值包括:1、10、11、20、21、25、30、31等共32个。)

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目