ricocococo 发表于 2019-8-7 14:28:12

求全部正整数解出现错误,提交只是部分正确,大家帮我看看哪里错了

本题要求对任意给定的正整数N,求方程X ​2 ​​ +Y ​2 ​​ =N的全部正整数解。
#include<stdio.h>
#include<math.h>

int main(int argc,char** argv){
    int n;
    scanf("%d",&n);
    int j,k;
    int t=0;
    for (j=1;j<sqrt(n);j++){ //递增j
      k=n-j*j;                        //
      int i=sqrt(k);                   //将n-j*j结果求根并且int;
      if (i*i==k && i!=0){
            printf("%d %d\n",j,i);
            t=1;
      }
    }
    if (!t){
      printf("No Solution");
    }

    return 0;
}

ricocococo 发表于 2019-8-7 14:29:36

是x*x+y*y=n的函数

AmosAlbert 发表于 2019-8-7 16:57:43

你把错误上传一下,或者是验证不符合的数据

ricocococo 发表于 2019-8-7 18:19:33

提交时间        状态        分数        题目        编译器        耗时        用户
2019/8/7 18:16:56       
部分正确
2        7-21        C (clang)        2 ms        rayng
测试点        提示        结果        耗时        内存
0        sample 1        答案错误        2 ms        296 KB
1        sample 2        答案正确        2 ms        284 KB
2        最大有解N        答案错误        2 ms        264 KB

新学 发表于 2019-8-7 20:41:31

你是说计算两个整数的平方等于所给的数,求这两个整数所有可能值对吧!
x^2 + y^2 = n(n由用户所给定);求 x 和 y。
你的代码没问题,可以求出所有正整数解。由于 j 小于 n 的 开方,j 的值由 0 到 n 的开方,对应 i的值就会由 n 的开方到 0,就会出现重复解,可以再给 j 增加这么一条限制 j <= i ;
源代码如下:

#include<stdio.h>
#include<math.h>

int main(int argc,char** argv){
    int n;
    scanf("%d", &n);
    int i, j, k;
    int t = 0;
    for (i = 0,j = 1;j < sqrt(n) && j <= i; j++){ //递增j
      k=n-j*j;                        //
      i=sqrt(k);                     //将n-j*j结果求根并且int;
      if (i*i==k ){
            printf("%d %d\n",j,i);
            t=1;
      }
    }
    if (!t){
      printf("No Solution");
    }

    return 0;
}

或者对你的代码最简单的修改是:

本题要求对任意给定的正整数N,求方程X ​2 ​​ +Y ​2 ​​ =N的全部正整数解。
#include<stdio.h>
#include<math.h>

int main(int argc,char** argv){
    int n;
    scanf("%d",&n);
    int j,k;
    int t=0;
    for (j=1;j<sqrt(n);j++){ //递增j
      k=n-j*j;                        //
      int i=sqrt(k);                     //将n-j*j结果求根并且int;
      if (i*i==k && j <= i ){// j <= i, 其中 j > 0, i <= 0 就不可能了。
            printf("%d %d\n",j,i);
            t=1;
      }
    }
    if (!t){
      printf("No Solution");
    }

    return 0;
}

ricocococo 发表于 2019-8-7 21:52:46

新学 发表于 2019-8-7 20:41
你是说计算两个整数的平方等于所给的数,求这两个整数所有可能值对吧!
x^2 + y^2 = n(n由用户所给定); ...

谢谢不过依然是错的,我的代码是把一个数递增,然后给出的n减去这个递增数的平方,把这部分求根并化为整数,再看递增数的平方与求根的平方是否等于给出的n,所以不存在重复解。

主要是代码就是通不过pta的检测。

ricocococo 发表于 2019-8-7 21:53:54

AmosAlbert 发表于 2019-8-7 16:57
你把错误上传一下,或者是验证不符合的数据


提交时间      状态      分数      题目      编译器      耗时      用户
2019/8/7 18:16:56      
部分正确
2      7-21      C (clang)      2 ms      rayng
测试点      提示      结果      耗时      内存
0      sample 1      答案错误      2 ms      296 KB
1      sample 2      答案正确      2 ms      284 KB
2      最大有解N      答案错误      2 ms      264 KB

AmosAlbert 发表于 2019-8-8 11:52:22

2我运行后答案是(1,1)没问题吖!
0和1是的确有问题的
0的答案应该是(0,0)
问题原因:
      你看这条判断语句for (j=1;j<sqrt(n);j++)
j的初始值为1,而sprt(0)还是0,1<0,进不到这个循环里,所以输出no solution


1的答案应该是(1,0)或(0,1)
问题原因:同上1=1而不小于1。所以进不到循环里面
解决方案 :建议写两个if单独判断1,0.或者调节这条语句for (j=1;j<sqrt(n);j++)里面的值

AmosAlbert 发表于 2019-8-8 11:53:08

可以给个最佳答案吗???楼主·{:10_257:}{:10_257:}

ricocococo 发表于 2019-8-8 17:18:25

#include<stdio.h>
#include<math.h>

int main(int argc,char** argv){
    int n;
    scanf("%d",&n);
    int j,k;
    int t=0;
    for (j=1;j<sqrt(n);j++){ //递增j
      k=n-j*j;                        //
      int i=sqrt(k);                     //将n-j*j结果求根并且int;
      if (i*i==k && j<i){
            printf("%d %d\n",j,i);
            t=1;
      }
    }
    if (!t){
      printf("No Solution");
    }

    return 0;}

ricocococo 发表于 2019-8-8 17:21:27

AmosAlbert 发表于 2019-8-8 11:52
2我运行后答案是(1,1)没问题吖!
0和1是的确有问题的
0的答案应该是(0,0)


问题原因:
      你看这条判断语句for (j=1;j<sqrt(n);j++)
j的初始值为1,而sprt(0)还是0,1<0,进不到这个循环里,所以输出no solution

其实0,1标明no solution是对的,因为要求正整数解,我的错误想了以后是没有考虑J<K的关系,但还是感谢你的启发。

AmosAlbert 发表于 2019-8-8 18:59:13

ricocococo 发表于 2019-8-8 17:21
问题原因:
      你看这条判断语句for (j=1;j

谢谢楼主(0不是正整数,哈哈哈,忘记了)
页: [1]
查看完整版本: 求全部正整数解出现错误,提交只是部分正确,大家帮我看看哪里错了