杭電1407-暴力と最適化

13687 ワード

                     LTC 

Problem DescriptionはLTCに感心してはいけませんが、もし試合がこのテーマしかないなら、私はあなたと彼が絶対に水平線にいることを保証します!あなたの任務は:方程式x^2+y^2+z^2=numの正の整数解を計算することです.
Input入力データは複数のテストインスタンスを含み、各インスタンスは1行を占め、10000以下の正の整数numのみを含む.
Outputは各テストデータのセットについて、x,y,zの増加順にその最小正の整数解を出力してください.各インスタンスの出力は1行を占めています.問題はすべてのテストデータに解があることを保証します.
Sample Input 3
Sample Output 1 1 1
エラーコード:
なるべくreturnを使わない
# include <iostream>
# include <cstdio>

int main(){

    int num;
    int flaf = 0;
    while(scanf("%d",&num)!=EOF){
        for(int i=1;i<=10000;i++)// 100 10000,x^2+y^2+z^2= num  i<=num 
            for(int j=i;j<=10000;j++)
                for(int k=j;k<=10000;k++)
                    if(i*i+j*j+k*k==num){
                        printf("%d %d %d
"
,i,j,k); return 0; flag = 1; } } return 0; }

タイムアウトのコード:
# include <iostream>
# include <cstdio>

int main(){

    int num;

    while(scanf("%d",&num)!=EOF){

    int flag = 0;
    for(int i=1;i<=num;i++){
        for(int j=i;j<=num;j++){
            for(int k=j;k<=num;k++)
                if(i*i+j*j+k*k==num&&j>=i&&k>=j){
                    printf("%d %d %d
"
,i,j,k); flag = 1; } if(flag==1) break; } if(flag==1) break; } } return 0; }

Acceptedの発行(748 MS):
# include <iostream>
# include <cstdio>
# include <cmath>
int main(){

    int num;

    while(scanf("%d",&num)!=EOF){

    int flag = 0;
    for(int i=1;i<=sqrt(num);i++){
        for(int j=i;j<=sqrt(num);j++){
            for(int k=j;k<=sqrt(num);k++)
                if(i*i+j*j+k*k==num&&j>=i&&k>=j){
                    printf("%d %d %d
"
,i,j,k); flag = 1; } if(flag==1) break; } if(flag==1) break; } } return 0; }

エラーコード:
# include <iostream>
# include <cstdio>

int main(){

    int n,m;
    int i,j,k;

    while(scanf("%d",&n)!=EOF){

        int flag = 0;

        for(i=1;i*i<=100;i++){
        // , i i<=100, i*i i*i<=n, 
            for(j=i;j*j<=100-i;j++){
                for(k=j;k*k<=100-i-j;k++){
                    if(i*i+j*j+k*k==n){
                        printf("%d %d %d
"
,i,j,k); flag = 1; break; } } if(flag) break; } if(flag) break; } } return 0; }

正しいコード:
# include <iostream>
# include <cstdio>

int main(){

    int n,m;
    int i,j,k;

    while(scanf("%d",&n)!=EOF){

        int flag = 0;

        for(i=1;i*i<=n;i++){
            for(j=i;j*j<=n-i;j++){
                for(k=j;k*k<=n-i-j;k++){
                    if(i*i+j*j+k*k==n){
                        printf("%d %d %d
"
,i,j,k); flag = 1; break; } } if(flag) break; } if(flag) break; } } return 0; }

コミットコード2:
エラーコード:
#include <iostream>
#include <cstdio>
#include <cmath>
#define M 100
using namespace std;
int main()
{
    int m;
    while(scanf("%d", &m) != EOF){
        double k = 0;

             for(int i=1; i<sqrt(m); i++)
            {
                for(int j=1; j<sqrt(m); j++)
                {
                    k = sqrt(m - i*i - j*j);
                    if(!(k- int(k)) && k != 0)
                    {
                        printf("%d %d %d
"
, i, j, int(k)); goto the; } } } the:{} } return 0; }

正しいコード:
#include <iostream>
#include <cstdio>
#include <cmath>
#define M 100
using namespace std;
int main()
{
    int m;
    while(scanf("%d", &m) != EOF){
        double k = 0;

             for(int i=1; i<100; i++)
            {
                for(int j=1; j<100; j++)
                {
                    k = sqrt(m - i*i - j*j);
                    if(!(k- int(k)) && k != 0)
                    {
                        printf("%d %d %d
"
, i, j, int(k)); goto the; } } } the:{} } return 0; }