羊羊整除
(div.pas/c/cpp)
【问题描述】
羊年到了,村长开始教小羊学习 Pascal 语言,刚开始学习四则运算。村长在白板上
下两个整数 16 和 3,问小羊们,有 16 只羊,平均分到 3 个羊村,每个羊村分到的数量必
相同,这个分配的数量最大是多少?小羊们很快就得到了答案,每个羊村分到 5 只,有
只羊就只能落单了。村长在白板上写下 5。没错,这个就是 Div(整除)的用法!
为了检验小羊们是否掌握了整除运算,村长要求小羊们轮流从白板上任意选取两个不
的数,由大数整除小数,若所得结果没有出现在白板上,就将该值写在白板上。直到小羊
再也找不到没出现过的整数。
虽然这样上课很锻炼小羊们的运算能力,但是课堂时间有限。为了控制课堂时间,村
想要知道,根据当前白板上的数字,最终白板上会出现几个数字?现在请你帮他编写一个
序快速计算一下吧!
【输入】
第一行一个整数 N,表示当前白板上出现的整数个数。
第二行 N 个整数,中间用空格分隔,表示当前在白板上的数字,保证每个数字都不
同。
【输出】
输出一个整数,表示最终白板上数字的个数。
【输入输出样例 1】
div.in div.out
2
16 3
4
【样例 1 解释】
选择 16 和 3,写下 5; 选择 5 和 3,写下 1;共 16, 3, 5, 1,四个整数。
【输入输出样例 2】
div.in div.out
3
17 2 1
5
【样例 2 解释】
选择 17 和 2,写下 8;再选择 8 和 2,写下 4;共 17, 2, 8, 4, 1,五个整数。
【数据范围】
50%的数据, N<=50;
100%的数据, N<=100, 1<=ai<=100。
本题使用的是桶的思路。开a[105]的桶
初始化,先读入所有数,将所有数放入桶中。
i从100至1扫描。如果a[i]有数,则j从a[i]至1扫,a[a[i]/j]=1(此处有数)。
下面是代码
#include<cstdio>
#include<cstdlib>
using namespace std;
int i,j,k,n,m,tot;
int f[105],a[105];
int read(void) {
char c; while (c=getchar(),(c<'0' || c>'9') && c!='-'); int x=0,y=1;
if (c=='-') y=-1; else x=c-'0';
while (c=getchar(),c>='0' && c<='9') x=x*10+c-'0'; return x*y;
}
int main()
{
n=read();
for(int i=1;i<=n;i++){
f[i]=read();
a[f[i]]=1;
}
for(int i=100;i>=1;i--)
if(a[i]==1)
for(int j=i-1;j>=1;j--)
if(a[j]==1)
a[i/j]=1;
for(int i=1;i<=100;i++) if(a[i]==1) tot++;
printf("%d",tot);
return 0;
}