3

数値の表現の数を 3 つの正の二乗の合計として返す関数 head を作成する必要があります。

たとえば、3 平方の合計としての 3 の唯一の表現は 3 = 1+1+1 であるため、数値 = 3 の場合、関数は 1 を返す必要があります。n が 27 の場合、27 には 2 つの表現があるため、関数は 2 を返す必要があります 27 = 25 + 1 +1 または 9+9+9。

これは私が試したことです:

#include <iostream>
#include <cmath>
using namespace std;

int  numRep(int num);

int main()
{
   int count = numRep(27);
   cout << count;
   return 0;
}

int numRep(int num)
{
   int count = 0, sum = 0;
   int a =1, b=1, c=1;
   while(a*a <= num -2)
   {
     b = 1; 
     while(b*b <= num -2)
     {
       c =1;
       while(c*c <= num -2)
       {
         sum = a*a + b*b + c*c;
         if (sum == num) count++;
         c++;
       }
       b++;
     }
     a++;
   }
   return count/3;
}

しかし、正しい出力が得られません。いくつかのガイダンスが必要です...より良い方法がある場合は、提案してください..

4

5 に答える 5

2

1 から num - 2 まで検索する代わりに、上記の現在のインデックス ループからのみ検索する必要があります。そうすれば、用語を繰り返さなくなります。

#include <iostream>
#include <cmath>
using namespace std;

int  numRep(int num);

int main()
{
   int count = numRep(27);
   cout << count << endl;
   return 0;
}

int numRep(int num)
{
   int count = 0, sum = 0;
   int a =1, b=1, c=1;
   while(a*a <= num -2)
   {
     b = a; 
     while(b*b <= num -2)
     {
       c =b;
       while(c*c <= num -2)
       {
         sum = a*a + b*b + c*c;
         if (sum == num) {
            count++;
         }
         c++;
       }
       b++;
     }
     a++;
   }
   return count;
}
于 2013-08-06T18:10:02.737 に答える
1

すべての順列を取得していて、すべての組み合わせが必要です。

例: numRep(14) は 6 を返しますが、1 だけにしたい場合。

a = 1, b = 2, c = 3
a = 1, b = 3, c = 2
a = 2, b = 1, c = 3
a = 2, b = 3, c = 1
a = 3, b = 1, c = 2
a = 3, b = 2, c = 1

答えを追跡する必要があります。できれば ac が最低から最高の順に並べ替えられ、すでに存在する場合はカウントを増やしません。

于 2013-08-06T18:07:50.880 に答える
1

これは私のために働く:

 int numRep(int num){

   int count = 0;

   for(int a = 1; a * a <= num ; ++a)
        for(int b = a; b * b <= num ; ++b)
            for(int c = b; c * c <= num ; ++c)
                if (a*a + b*b + c*c == num) 
                    count++;

   return count;
}

fromとbfromでのみ開始するため、同じソリューションを 2 回カウントすることはありません。acb

これの複雑さはO(N*sqrt(N))私が思うです。

于 2013-08-06T18:09:05.193 に答える
0

から 2 番目のループを開始するだけaです。そして、3 番目のループはまったく必要ありません。c = sqrt(num - a*a - b*b). 計算さcれた値が整数の場合、カウントされます。

于 2013-08-07T05:40:20.893 に答える