二维数据处理:1~9组成三个3位的平方数

该程序采用回溯法解决数学问题,找出1到9这9个数字组成的三个不重复的三位数,每个数都是一个平方数。程序首先生成所有可能的合法三位数平方数,然后通过三层循环进行搜索,检查每组数字是否互不相同且不包含重复的数字。当找到满足条件的组合时,输出这三个三位数的平方数。示例输出为:361, 529, 784。
摘要由CSDN通过智能技术生成

 1~9组成三个3位数的平方数。将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不许有重复数字,要求每组中的三位数都组成一个平方数 **输入格式要求:提示信息:"The 3 squares with 3 different digits each are:\n" **输出格式要求:"%d,%d,%d\n" 程序运行示例如下: The 3 squares with 3 different digits each are: 361,529,784

#include <stdio.h>
#include <math.h>
int check(int a[3],int b[3]);
// 若两个用数组保存的三位数有重复元素,返回1;若没有,返回0
int main()
{
    int num[21][3],t[3],a[3],b[3],c[3],flag;
    int i,j,k,n,m;
    //将所有合法三位数写入数组num。
    for(i=11,j=0;i<=31;i++)
    {
        m=pow(i,2);
        if(m%10!=0)
        {
            t[0]=m/100;
            t[1]=(m/10)%10;
            t[2]=m%10;
            if(t[0]!=t[1]&&t[1]!=t[2]&&t[0]!=t[2])
            {
                num[j][0]=t[0];
                num[j][1]=t[1];
                num[j][2]=t[2];
                j++;
            }
        }
    }
    n=j;//k记录了合法的三位数个数
    printf("符合要求的3个三位数为:\n");
    // 回溯法:使用三个嵌套的for循环来进行搜索,使用if语句实现剪枝
    for(i=0;i<n-2;i++)
    {
        a[0]=num[i][0];
        a[1]=num[i][1];
        a[2]=num[i][2];
        for(j=i+1;j<n-1;j++)
        {
            b[0]=num[j][0];
            b[1]=num[j][1];
            b[2]=num[j][2];
            // 需进行检查,a与b两个三位数中没有重复数字,才寻找第三个三位数c;
            //否则依赖for循环的作用,向后继续找b
            flag=check(a,b);
            if(flag)
            {
                // 寻找第3个三位数
                for(k=j+1;k<n;k++)
                {
                    c[0]=num[k][0];
                    c[1]=num[k][1];
                    c[2]=num[k][2];
                    flag=check(b,c)&&check(a,c);
                    if(flag)
                       printf("%d%d%d,%d%d%d,%d%d%d",a[0],a[1],a[2],b[0],b[1],b[2],c[0],c[1],c[2]);
                }
            }
        }
    }
    return 0;
}
int check(int a[3],int b[3])
{
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            if(a[i]==b[j])
                return 0;
        }
    }
    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值