比如说要找到a和b之间约数最多的那个数,然后我把a到b间每个数的约数算出来了,并且知道了最大的约数是多少,那么我该怎么才能输出这个拥有最多约数的数本身呢?
//最多约数问题 #include<iostream> using namespace std; int div(int n) { int count=0; for(int i=1;i<=n;i++) { if(n%i==0) count++; } return count; } int main() { int a,b; cin>>a>>b; int max=0; for(int i=a;i<=b;i++) { div(i)>max?max=div(i):max=max; } cout<<max; return 0; }
还有就是在贪婪算法里,
2 5
3 7
1 8
假设上面的数左右一一对应
我们比较完右边的数,怎么把它对应的左边的数输出?
你用个数组来存,然后就能够输出来了
for(int i=a;i<=b;i++)
{
if( div(i)>max )
{
max=div(i);
ans=i;
}
}
ans记录的就是具有约数个数最大的那个数
第一个问题其实很简单:
你在main函数里面用到了算法中的“动态规划”求得约数个数的max,同样可以用该方法方便地得到具有最多约数的原始数。
方法是定义一个临时的countMax,然后每次div(i)>max的时候,countMax = i,否则不变。
第二个问题:呵呵,我还没学,学好了,可以交流。
补充:哈哈,今天看了贪婪算法。你的意思是不是最基本的活动安排问题?我想你应该给一个具体的例子说明你的问题。
第一个问题:
像前面有人提到的:
for(int i = a; i <= b; i++){ int tmp = div(i); if(tmp > max){ max = tmp; ans = i; } }
这样ans就是你要的数
第二个问题:
最简单的左右两边分别存在两个数组left和right中,用right[i]去比较,
然后得到你要的right[i] 那么left[i]就是对应的左边的那个数
----
如果右边的数顺序会打乱(如排序),那可以定义一个结构体
struct Num{
int left, right;
}n[MAXN];
用n[i].right去比较,然后最后那个变量对应的n[i].left就是你要的
ps.你问的这些问题属于语言基础的部分,多看书多做些实验题吧...
看你这架势,像是要搞ACM的?我只能说如果真想搞ACM的话,路还很长。