问题 F: 两倍1006
题目描述
作为算术能力计划的一部分,您的学生将被随机生成2到15个唯一正整数的列表,并要求确定每个列表中有多少项是同一列表中其他项的两倍。 您将需要一个程序来帮助您进行评分。该程序应该能够扫描列表并为每个列表输出正确的答案。例如,给定列表1 4 3 2 9 7 18 22,您的程序应该回答3,因为2是两次1,4是两次2,18是两次9。
输入
输入文件将包含一个或多个数字列表。每行将有一个数字列表。每个列表将包含2到15个唯一正整数。所有整数都小于99。每一行以整数0结束,0不被视为列表的一部分。 带有单个数字-1的行表示文件输入结束。下面的示例输入显示了3个单独的列表。某些列表可能不包含任何符合条件的数。
输出
每一行输入列表都有一行输出,输出该列表中有多少项是同一列表中其他项的两倍。
样例输入 Copy
1 4 3 2 9 7 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0
-1
样例输出 Copy
3
2
0
题解
字面意思,就是一个查找问题,两次循环O(n^2)的复杂度。
优化:先从小到大先排序,然后对每一个数查找左边(我懒,未优化直接过了,我就没写了,仅提供思路)
代码(AC)未优化版
点击查看代码
#include<stdio.h>
int main()
{
int a,i;
int b[30];
while(1)
{
scanf("%d",&a);
if(a==-1)
{
break;
}
else
{
b[0]=a;
for(i=1;i<30;i++)
{
scanf("%d",&a);
if(a==0)
{
break;
}
else
{
b[i]=a;
}
}
}
int sum=0;
for(int j=0;j<i;j++)
{
for(int k=0;k<i;k++)
{
if(b[k]==2*b[j])
{
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}