杭電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;
}