题目要求 将数组{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);
}
}
这样?这个转置条件
#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;
}
}
}
}
采用模拟思路,根据题目要求,逐步完成打印即可
我也想问这道题怎么做来着