如图1所示,填入1~12的数字。使得每条直线上的数字之和都相同。图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请问这个代码哪里错了呀?
#include<stdio.h>
#include<iostream>
using namespace std;
{
int a[12];
int t[6];
a[1]=1;
a[2]=8;
a[12]=3;
for(a[3]=2;a[3]<=12;a[3]++)
for(a[4]=2;a[4]<=12;a[4]++)
for(a[6]=2;a[6]<=12;a[6]++)
for(a[7]=2;a[7]<=12;a[7]++)
{
a[9]=26-8-3-a[6];
a[10]=26-3-a[5]-a[7];
a[11]=26-1-a[4]-a[7];
if(a[i]<=12&&a[i]>=1&&a[1]!=a[2]&&a[2]!=a[3]&&a[3]!=a[4]&&a[4]!=a[5]&&a[5]!=a[6]&&a[7]!=a[8]&&a[9]!=a[10]&&a[10]!=a[11]&&a[11]!=a[12])
{
printf("%d",a[6])
}
return 0;
}
}
这个代码有几个问题,
int main()
的定义。if
语句中,您需要检查数组中的所有元素是否都不相等。您可以使用一个函数来实现这个功能。if
语句中,您需要检查所有的 a[i]
是否在 1 到 12 之间。printf
语句中,缺少分号。#include <stdio.h>
#include <iostream>
using namespace std;
bool all_different(int a[], int n) {
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (a[i] == a[j]) {
return false;
}
}
}
return true;
}
int main() {
int a[13];
int t[6];
a[1] = 1;
a[2] = 8;
a[12] = 3;
for (a[3] = 2; a[3] <= 12; a[3]++)
for (a[4] = 2; a[4] <= 12; a[4]++)
for (a[6] = 2; a[6] <= 12; a[6]++)
for (a[7] = 2; a[7] <= 12; a[7]++) {
a[9] = 26 - 8 - 3 - a[6];
a[10] = 26 - 3 - a[5] - a[7];
a[11] = 26 - 1 - a[4] - a[7];
if (all_different(a, 12)) {
printf("%d\n", a[6]);
}
}
return 0;
}
这个代码可能仍然无法解决问题,因为它没有检查所有的 a[i]
是否在 1 到 12 之间。您需要添加一个额外的函数来检查这个条件。
#include <stdio.h>
int pd(int s, int sum) //sum表示次数
{
if (s == 1) return sum;
else if (s > 1 && s % 2 == 0)
{
sum++;
pd(s / 2, sum);
}
else if (s > 1 && s % 2 == 1)
{
sum++;
pd(3 * s + 1, sum);
}
else return -1;
}
int main(void)
{
int a = 0;
printf("输入一个自然数:");
scanf("%d", &a);
printf("至少需经过%d次运算可以得到自然数1\n", pd(a, 0));
return 0;
}