鱼C论坛

 找回密码
 立即注册
查看: 1530|回复: 11

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

[复制链接]
发表于 2019-8-7 14:28:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本题要求对任意给定的正整数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;
}
最佳答案
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++)里面的值

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-7 14:29:36 | 显示全部楼层
是x*x+y*y=n的函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-7 16:57:43 | 显示全部楼层
你把错误上传一下,或者是验证不符合的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

主要是代码就是通不过pta的检测。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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++)里面的值

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-8 11:53:08 | 显示全部楼层
可以给个最佳答案吗???楼主·
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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的关系,但还是感谢你的启发。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-8 18:59:13 | 显示全部楼层
ricocococo 发表于 2019-8-8 17:21
问题原因:
      你看这条判断语句for (j=1;j

谢谢楼主(0不是正整数,哈哈哈,忘记了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 03:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表