算法设计与分析 第3次实验课

最多公约数问题

题目描述

正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b<=36,找出a和b之间约数个数最多的数x。

输入
对于给定的2个正整数a≤b。
输出
编程计算a 和 b 之间约数个数最多的数的数量,和约数最多的数。
样例输入 Copy
1 36
样例输出 Copy
9

原创代码

//最多公约数问题
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

char c;
int a, b;

int count_[40];

int div( int n )
{
    
    

    int cou = 0, i;


    for(  i=1; i*i<n; i++)
    {
    
    
        if( n % i ==0 )
        {
    
    
            cou += 2;
        }
    }

    if( i*i == n )
    {
    
    
        cou++;
    }

    return cou;
}

int main()
{
    
    
    int k=0;
    cin >> a >> c >> b;

    for( int i=a; i<=b; i++)
    {
    
    
        count_[k] = div(i);
        k++;
    }
    sort(count_, count_+k, greater<int>());
    cout << count_[0] << endl;


    return 0;
}

汽车加油问题(贪心算法)

在线测试

题目描述

一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。

数据输入:n:表示汽车加满油后可行驶nkm

      k:旅途中有k个加油站

     k+1个整数:表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。

数据输出:最少加油次数和具体在哪几个加油站加油。

例如: n=7 k=7

K+1个整数:1 2 3 4 5 1 6 6

最优值:4

扫描二维码关注公众号,回复: 15491501 查看本文章

原创代码

#include<iostream>
using namespace std;

int n, k, cou, j=0, sum=0;
int mile[50], book[50];

int main()
{
    
    

    cin >> n >> k;

    for( int i=0; i<=k; i++ )
    {
    
    
        cin >> mile[i];
    }

    for( int i=0; i<=k; i++ )
    {
    
    
        if( mile[i] > n)
        {
    
    
            cout << "No Solution" << endl;
            return 0;
        }
        sum += mile[i];
        if( sum > n)
        {
    
    
            book[j] = i;
            j++;
            sum = mile[i];
        }
        if( sum == n && i<k )
        {
    
    
            book[j] = i+1;
            j++;
            sum = 0;
        }

    }

    cout << "最少加油次数:" << j << endl << "加油站位置为:" ;

    for( int i=0; i<j; i++)
    {
    
    
        if( i != j-1 )
            cout << book[i] << ' ';
        else
            cout << book[i];
    }

    return 0;
}


下边的这篇代码是大佬帮我检测的时候,在最外层加了while循环来方便输入多组数据进行检测。但是,我声明的全部是全局变量。导致每次循环都会有变量没有置0,因此,导致多组测试样例没有办法通过。

#include<iostream>
using namespace std;

int n, k, cou, j=0, sum=0;
int mile[50], book[50];

int main()
{
    
    
    while(1){
    
    
    cin >> n >> k;

    for( int i=0; i<=k; i++ )
    {
    
    
        cin >> mile[i];
    }

    for( int i=0; i<=k; i++ )
    {
    
    
        if( mile[i] > n)
        {
    
    
            cout << "No Solution" << endl;
            return 0;
        }
        sum += mile[i];
        if( sum > n)
        {
    
    
            book[j] = i;
            j++;
            sum = mile[i];
        }
        if( sum == n && i<k )
        {
    
    
            book[j] = i;
            j++;
            sum = 0;
        }

    }

    cout << "最少加油次数:" << j << endl << "加油站位置为:" ;

    for( int i=0; i<j; i++)
    {
    
    
        if( i != j-1 )
            cout << book[i] << ' ';
        else
            cout << book[i];
    }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_46161051/article/details/115254541