搜索
查看: 826|回复: 13
打印 上一主题 下一主题

关于挑战38:拆分勾股数。完整代码如下

[复制链接]
跳转到指定楼层
楼主
发表于 2015-6-21 21:23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
本帖最后由 福华 于 2015-6-21 21:23 编辑

已通过编译的代码:
#include <stdio.h>
#include <stdlib.h>
int ggs(int a,int b,int c)/*定义函数ggs来判断勾股数*/
{
   if(a*a+b*b==c*c)   return 1;
   else                         return 0;
}
int main()
{
     int n,a,b,c,amount=0;              /*n代表要拆的数,abc为一组勾股数,amount用于计数*/
     for(n=3;n<=1000;n++)
    {
          for(a=3;a<=n/3;a++)         /*根据题意,a<n/3*/
                for(b=a+1;b<=n/2;b++) /*根据题意,b<n/2*/
               {
                c=n-a-b;
                    if(ggs(a,b,c))
                    {
                    printf("%d=%d+%d+%d\n",n,a,b,c);
                    amount++;
                    break;             /*a,b,c满足时,a,b+1,c-1必定不满足,进入a+1*/
                    }
               }
    }
    printf("总数=%d\n",amount);
    getch();
    system("pause");
    return 0;
}
结果显示有3至1000中,有325个整数可以拆分为勾股数。
然而一直通不过。
问题在哪?

最佳答案

查看完整内容

提示一下,需要去重,可以再试试~
沙发
发表于 2015-6-21 21:23:01 | 只看该作者
提示一下,需要去重,可以再试试~
板凳
发表于 2015-6-22 12:59:59 | 只看该作者
这样拆会有很多重复的,实际答案是190个
(其实我写的也不怎么样但还是发一下)
[mw_shl_code=c,true]//C++
#include <iostream>
#include <vector>
#include <algorithm>
int main(int argc, const char * argv[]) {
    std::vector<int> v;
    for(int a=1;a<500;++a)
        for (int b=1; b<=1000-a; ++b)
            for (int c=1; c<=1000-a-b; ++c)
                if(a*a+b*b==c*c&&a+b+c<=1000)
                    v.push_back(a+b+c);
    std::sort(v.begin(), v.end());
    v.erase(std::unique(v.begin(), v.end()), v.end());
    std::cout<<v.size()<<std::endl;
    return 0;
}
[/mw_shl_code]
地板
 楼主| 发表于 2015-6-22 14:00:35 | 只看该作者
981013 发表于 2015-6-22 12:59
这样拆会有很多重复的,实际答案是190个
(其实我写的也不怎么样但还是发一下)
[mw_shl_code=c,true]//C ...

你的代码怎么粘上去的啊?
5#
 楼主| 发表于 2015-6-22 14:08:28 | 只看该作者
LeoGuozichuan 发表于 2015-6-22 13:49
提示一下,需要去重,可以再试试~

确实有重复C:\Users\Bill\Pictures

点评

图片怎么上的呀  发表于 2015-6-22 14:09
6#
 楼主| 发表于 2015-6-22 14:24:08 | 只看该作者
去除重复后的代码:[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
int ggs(int a,int b,int c)/*定义函数ggs来判断勾股数*/
{
        if(a*a+b*b==c*c)        return 1;
    else                                return 0;
}
int main()
{
        int n,a,b,c,amount=0,f;
    for(n=3;n<=1000;n++)
    {
    f=0;
                for(a=3;a<=n/3;a++)         /*根据题意,a<n/3*/
                {
            for(b=a+1;b<=n/2;b++)        /*根据题意,b<n/2*/
            {
                                c=n-a-b;
                if(ggs(a,b,c))       
                {
                                        printf("%d=%d+%d+%d\n",n,a,b,c);
                    amount++;
                    f=1;
                    break;
                }
   
            }
        if(f==1) break;/*找到一种拆分,就及时进入n+1避免重复*/
        }
    }
    printf("总数=%d\n",amount);
    getch();
        system("pause");
        return 0;
}
[/mw_shl_code]
7#
 楼主| 发表于 2015-6-22 14:25:05 | 只看该作者
额,还是不会粘贴代码,谁能教教我

点评

奇迹发生了,再回来代码已经对齐  发表于 2015-6-22 14:31
8#
 楼主| 发表于 2015-6-22 14:26:49 | 只看该作者
写的时候代码都很整齐的,复制上来就乱了
9#
发表于 2015-6-22 17:13:55 | 只看该作者
不对呀,我粘贴的时候就不会乱啊
10#
 楼主| 发表于 2015-6-23 22:08:10 | 只看该作者
嗯,粘贴的时候有个<>可以选的
11#
发表于 2015-7-8 20:00:35 | 只看该作者
应该先构造勾股素数
12#
 楼主| 发表于 2015-7-10 20:48:03 | 只看该作者
rosynirvana 发表于 2015-7-8 20:00
应该先构造勾股素数

勾股数跟素数有什么关系,
好像有点关系,这是数学问题,让我想想
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表