最多公约数问题
题目描述
正整数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
原创代码
#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;
}