C语言小练习 置换数字

题目要求 将数组{1-9}根据以下的方式进行置换 并且输出一个矩阵 检查是否为正确
置换条件是:1->3 2->4 3->9… 如下
1 2 3 4 5 6 7 8 9
3 4 9 1 7 5 2 8 6

例如 输入
3 4 9 1 7 5 2 8 6
应当输出
1 2 3 4 5 6 7 8 9
3 4 9 1 7 5 2 8 6
输入时需要检查每次输入的是否为1-9的数字,且每个数字只能输入一次
否则需要报错
如果输入正确的数字,则将置换的结果打印成一个两行的矩阵


#include <stdio.h>
int a[9];                                   //存输入
int b[10] = {0, 4, 7, 1, 2, 6, 9, 5, 8, 3}; // 存置换对应数据
int c[9];                                   // 存结果
int main() {

    for (int i = 0; i < 9; i++) {
        scanf("%d", &a[i]);
        // 检查每次输入的是否为1-9的数字
        if (a[i] > 9 || a[i] < 1) {
            puts("input error");
            return 0;
        }
        // 检查每个数字只能输入一次
        for (int j = 0; j < i; j++) {
            if (a[j] == a[i]) {
                puts("input error");
                return 0;
            }
        }
        c[i] = b[a[i]];
    }

    for (int i = 0; i < 9; i++) printf("%d ", c[i]);
    printf("\n"); // 输出空行
    for (int i = 0; i < 9; i++) printf("%d ", a[i]);

    return 0;
}

good


#include<stdio.h>
#include<stdlib.h>    //调用动态分配函数需要包含此头文件

int N = 9;    //全局变量

//输入数据
void inputData(int *array) {
    int i;
    for(i = 0; i < N; i++)
        scanf("%d", &array[i]);
}

//返回置换数组
int *getTransform(int *array) {
    int *temp = (int *)malloc(sizeof(int) * N); //临时数组(sizeof(int)返回int的大小(4字节),乘以N表示N个整型变量)
    int j = 0, i;

        for (i = 0; i < N; i++) {   //遍历数组array的每个元素
            switch (array[i]) {    //匹配元素i
                case 1: temp[j++] = 4; break;
                case 2: temp[j++] = 7; break;
                case 3: temp[j++] = 1; break;
                case 4: temp[j++] = 2; break;
                case 5: temp[j++] = 6; break;
                case 6: temp[j++] = 9; break;
                case 7: temp[j++] = 5; break;
                case 8: temp[j++] = 8; break;
                case 9: temp[j++] = 3;
            }
        }
        return temp;
}

//返回1(有效)或0(无效)
int isValid(int *array) {
    int i, j;

    for(i = 0; i < N; i++) {
        if(array[i] < 1 || array[i] > 9)
            return 0;    //如果某个元素小于1或大于9,返回0
    
        int count = 0;    //计数重复的数(每次外循环置为0)
        for(j = 0; j < N; j++)
            if(array[j] == array[i])
                count++;    //如果array[j]等于array[i], count++
        if(count > 1) return 0;    //count大于1时,表明存在两个或以上的重复元素,返回0
    }
    return 1;    
}

//返回数组是否以自然序(升序)排列
int isNaturalSequence(int *array) {
    int i;
    for (i = 0; i < N - 1; i++)
        if (array[i] > array[i + 1])    //元素i大于i + 1时返回0
            return 0;
    return 1;
}

//打印数组
void printArray(int *array) {
    int i;
    for(i = 0; i < N; i++)
        printf("%3d", array[i]);
    putchar('\n');
}

void main() {
    int *array = (int *)malloc(sizeof(int) * N);    //数组(sizeof(int)返回int的大小(4字节),乘以N表示N个整型变量)
    
    inputData(array);    //输入数据

    if (!isValid(array))    //处理输入无效的情况(0为假,1为真,!号表相反意义)
        printf("Invalid input\n");
    else {
       //如果是自然序(升序),打印与原数组相同的数组,否则打印置换数组
       printArray(isNaturalSequence(array) ? array : getTransform(array));
       printArray(array);
    }
}

img

img

img

img

这样?这个转置条件

img

#include<stdio.h>
int main()
{
    int t[9],j,i;
    int hash[9]= {4,7,1,2,6,9,5,8,3};//按题目条件打表
    int trans[9];
    for(j=0; j<9; j++)
    {
        scanf("%d",&t[j]);
        if(t[j]>9||t[j]<1)
        {
            printf("输入错误");
            return 1;
        }
        for(i=0; i<j; i++)
        {
            if(t[i]==t[j])
            {
                printf("输入错误");
                return 1;
            }
        }
        trans[j]=hash[t[j]-1];
    }
    for(j=0; j<9; j++)
    {
        printf("%d ",trans[j]);
    }
    printf("\n");
    for(j=0; j<9; j++)
    {
        printf("%d ",t[j]);
    }
    return 0;
}
#include <stdio.h>

int main()
{
    int m[10] = {0, 4, 7, 1, 2, 6, 9, 5, 8, 3}, f[10] = {0}, a[10];
    for (int i = 1; i <= 9; i++)
    {
        int x;
        scanf("%d", &x);
        if (x < 1 || x > 9)
        {
            printf("The input number %d is out of range [1, 9].\n", x);
            return 1;
        }
        if (f[x])
        {
            printf("The input number %d already exists.\n", x);
            return 2;
        }
        f[x] = 1;
        a[i] = x;
    }
    for (int i = 1; i <= 9; i++)
        printf("%d ", m[a[i]]);
    printf("\n");
    for (int i = 1; i <= 9; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

int main()
{
    int t[9],j, i;
       //输入数字保存 
    for(j = 0; j < 9; j ++)
    {
        scanf("%d", &t[j]);
        if(t[j] > 9 || t[j] < 1)
        {
            printf("报错");
            return 1;
        }
        //检查输入的数字是否重复 
        for(i = 0; i < j; i ++)
        {
            if(t[i] == t[j])
            {
                printf("报错:输入了重复数字");
                return 1;
            }
        } 
    }

}

采用模拟思路,根据题目要求,逐步完成打印即可

我也想问这道题怎么做来着