C编程122 = 12 + 34 - 5 - 6 + 78 + 9

时间:2015-10-21 18:51:05

标签: c

输入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;
}

2 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。

只需将结果变量的类型更改为double即可。因为pow语句需要双重类型变量

答案 1 :(得分:0)

您的代码运行正常,这是输出的屏幕截图:

Input: n=145 Output: 123-4-56-7+89