输入n。在1,2,3,4,5,6,7,8,9之间放置+或 - 以找到等于n的表达式 (122 = 12 + 34 - 5 - 6 + 78 + 9或146 = 123 + 45 + 67 - 89)
我的想法是我们可以在两个数字之间填充3个值:0表示无空白,1表示+和2表示 - 例如1 + 2 + 3456 - 78 + 9是11000201.这是基数为3的数字 有3 ^ 8个表达式要测试,因为我们有8个位置要填充,每个有3个方法。 开始循环,我从1到3 ^ 8。将每个i转换为base-3-number,并将i的每个字符转换为+ - 或无空格,以计算当前表达式是否等于n。如果相等,则打印出表达式并结束循环...
我的问题是程序给了我错误的答案,我找不到错误。 例如我输入145但它给我123 + 45 + 67 - 89(= 146)
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n, result, a[100],count, i,j, test,temp, checkpoint,num,checkresult=0;
printf("Input n\n");
scanf("%d",&n);
for (num=1;num<=6561;num++)
{
count=1;
test = num;
result = 0;
checkpoint=0;
a[0]=1;
//convert to base 3
while (test>0)
{
a[count]=test%3;
//printf("%d ",a[count]);
test = test/3;
count++;
}
count--;
//put 0 to fill full 8 blank
while (count<8)
{
count++;
a[count]=0;
//printf("%d ",a[count]);
}
//inverse the sequence to have the right
for (i=1;i<=count/2;i++)
{
temp = a[i];
a[i] = a[count+1-i];
a[count+1-i] = temp;
}
//calculate the number
//1 is +, 2 is -, 0 is no blank
for (i=1;i<=8;i++)
{
if ((a[i]==1) || (a[i]==2))
{
if (a[checkpoint]==1)
for (j=checkpoint+1;j<=i;j++)
result = result + j*pow(10,i-j);
if (a[checkpoint]==2)
for (j=checkpoint+1;j<=i;j++)
result = result - j*pow(10,i-j);
checkpoint=i;
}
}
if (i==9)
{
if (a[checkpoint]==1)
for (j=checkpoint+1;j<=i;j++)
result = result + j*pow(10,i-j);
if (a[checkpoint]==2)
for (j=checkpoint+1;j<=i;j++)
result = result - j*pow(10,i-j);
}
//check if the result is correct or not. If correct, print it out and break the loop
if (result == n)
{
checkresult=1;
for (i=1;i<=8;i++)
{
printf("%d",i);
if (a[i]==1)
printf("+");
if (a[i]==2)
printf("-");
}
printf("9\n");
break;
}
}
if (checkresult==0)
printf("Can't found...");
return 0;
}
答案 0 :(得分:1)
我已经解决了这个问题。
只需将结果变量的类型更改为double即可。因为pow语句需要双重类型变量
答案 1 :(得分:0)
您的代码运行正常,这是输出的屏幕截图: