| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 864 人关注过本帖
标题:算法实现题1.3(探讨)
只看楼主 加入收藏
大蛇丸_
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-3
结帖率:75%
收藏
已结贴  问题点数:5 回复次数:10 
算法实现题1.3(探讨)
程序代码:
算法实现题1.3   
1.问题描述:正整数x的约数是能整除x的正整数.正整数x的约数个数记为div(x).例如,1, 2, 5,
          10都是正整数10的约数,且div(10) = 4.设a和b是2个正整数,a<=b,找出a和b之间约数个数最多的数x
2.算法设计:对于给定的2个正整数a<=b,计算a和b之间的约数的个数最多的数
数据输入:输入数据由文件名为input.txt的文本文件提供.文件的第1行有2个整整数a和b
结果输出:若找到a和b之间约数个数最多的数是x,则讲div(x)输出到文件output.txt
         输入文件示例                     输出文件示例
         input.txt                          output.txt
         1   36                             9
搜索更多相关主题的帖子: 正整数 
2013-06-15 15:25
zyh6110
Rank: 1
等 级:禁止发言
帖 子:10
专家分:5
注 册:2013-6-15
收藏
得分:2 
提示: 作者被禁止或删除 内容自动屏蔽
2013-06-15 15:28
大蛇丸_
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-3
收藏
得分:0 
..

冷静....!
2013-06-15 15:32
大蛇丸_
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-3
收藏
得分:0 
暴力先来一发...!
#include <stdio.h>
#include <string.h>

int main() {
    int max, n, i, a[1000], t, j;
    for( ; scanf("%d", &n) == 1; printf("%d\n", max)) {
        memset(a, 0, sizeof(a)); max = -1;
        for(i = 1; i <= n; i++) {
            for(j = 1; j <= i; j++)
                if(!(i % j)) a[i]++;
            if(a[i] > max) max = a[i];
        }
    }
    return 0;
}


冷静....!
2013-06-15 16:30
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:2 
首先一个数x化成素数的积:
x=a1^b1*a2^b2....an^bn

则x的约数总个数是(b1+1)*(b2+1)*...(bn+1)

从这个角度考虑用搜索+减枝应该可以

如果有提交的地方可以做做
2013-06-15 18:03
大蛇丸_
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-3
收藏
得分:0 
呵呵...这是我挑的经典题,没有提交的地方,这些题并不是一定要做出来,主要是和大家交流交流,开阔一下视野..!应该这些题看到了,还是会有似曾相识的感觉吧..!

冷静....!
2013-06-15 18:11
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
收藏
得分:2 
程序代码:
#include <iostream>
#include <fstream>
#include <ctime>
#include <cmath>
using namespace std;

ifstream fin("input.txt");
ofstream fout("output.txt");

clock_t start,finish;
double  total_time;

int div(int n)
{
    int num = 0;
    for (int i = 1; i < sqrt((float)n); i++)
    {
        if (n%i == 0)
        {
            num += 2;
        }
        
    }
    
    if (n == (int)sqrt((float)n)*(int)sqrt((float)n))
    {
        num ++;
    }
    return num;
}

int caculateMaxdiv(int a, int b)
{
    int maxNum = 0;
    for (int i = a;i <= b;i++ )
    {
        if ( maxNum < div(i))
        {
            maxNum = div(i);
        }
    }
    return maxNum;
}

int main()
{
    start = clock();
    int a,b;
    fin>>a>>b;
    fout<<caculateMaxdiv(a,b)<<endl;
    finish = clock();

    total_time = (double)(finish - start)/CLOCKS_PER_SEC;
    fout<<total_time<<" s"<<endl;
    return 0;
}

自由、民主、宪政!
2013-06-15 18:29
大蛇丸_
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-3
收藏
得分:0 
其实大家如果嫌麻烦的话,可以不用文件输入输出的方式,个人感觉还是有点麻烦的...

冷静....!
2013-06-16 10:57
yss0729
Rank: 3Rank: 3
来 自:江西 九江
等 级:论坛游侠
帖 子:43
专家分:197
注 册:2013-6-8
收藏
得分:0 
感觉LZ很厉害的样子
呵呵 本人刚学C ,LZ的意思我大概只明白80% ,可能是数学基础不太好的原因,若不考虑文件输入,请LZ帮忙看看这样是不是满足题目的要求
程序代码:
#include <stdio.h>

int main ()
{
    // i 为循环变量 aNum为起始数值 bNum为结束数值 count为标记量
    int i,aNum,bNum,count;
    printf("请输入两个数:\n");
    scanf("%d%d",&aNum,&bNum);
    if(aNum>bNum)
        return 0;
    count =0;
    for(i=aNum;i<=bNum;i++)
    {
        if(bNum % i==0)
            count++;
    }
    printf("从%d 到 %d 中,它们的公约数一共有 %d 个!",aNum,bNum,count);
    return 0;
} 
2013-06-16 11:15
大蛇丸_
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-3
收藏
得分:0 
理论上没错.!

冷静....!
2013-06-16 11:50
快速回复:算法实现题1.3(探讨)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051137 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved