一共三个编程题,其中一个是附加题,楼主没时间看了,在第二个题上卡了太久。
1. 乘积最大
有一个整数 n,将 n 分解成若干个不同自然数之和,问如何分解能使这些数的乘积最大,输出这个乘积 m。
第一个题 AC 了。
代码实现
#include <stdio.h>
int main()
{
int in;
int res = 1;
scanf("%d",&in);
int k=2;
int a[100]={0};
int i=0;
while (in>=k) {
a[i++]=k;
in-=k;
k++;
}
if (in) {
if (in==a[i-1]) {
a[i-1]++;
in--;
}
for (int j=0;j<in;j++) {
a[i-1-j]++;
}
}
for (int j=0;j<=i-1;j++) {
res*=a[j];
}
printf("%d",res);
return 0;
}
第二个题本 zhazha 只找出了无解的情况,wa,25%.
题目如下:
拼图,是一个老少皆宜的益智游戏,在打乱的 3*3 的范围中,玩家只能每次将空格 (0) 和相邻的数字格(上、下、左、右)交换,最终调整出一个完整的拼图。
完整拼图为:
1 2 3
4 5 6
7 8 0
测试数据共 3 行,每行 3 个数字 ,包括数字 0、1、2、3…..8(无重复)还原完整拼图的最少移动次数。如不需要调整,则输出 0;如无解,则输出 - 1。
例如:
0 1 3
4 2 5
7 8 6
依次移动 1,2,5,6,即可还原为正确拼图,移动次数为 4
样例输入:
0 1 3
4 2 5
7 8 6
样例输出
4
我只实现了无解的情况:
#include <stdio.h>
int isAnswer(int map[]){
int i = 0,j=0;
int cnt = 0;
for(i = 0; i < 8; i++)
for(j = i + 1; j < 9; j++)
{
if(map[i] > map[j])
cnt++;
}
for(i = 0; i < 9; i++)
{
if(map[i] == 0)
break;
}
if(cnt % 2 != i % 2) // 奇偶性不同则无解
{
return 0;
}
else
return 1;
}
int main(){
int map[9];
for (int i=0;i<9;i++) {
scanf("%d",&map[i]);
}
if (!(isAnswer(map))) {
printf("-1\n");
}
return 0;
}
还有一个附加题,没点开看,但是有人说附加题比较简单,失策了。