加载中...

浙江理工大学入队200题——18F

问题 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;
}
posted @ 2022-10-30 14:11  shany212  阅读(94)  评论(0编辑  收藏  举报