几道简单ACM题的解答----1

从这篇开始,发一些简单的ACM题及其解答,都是这几天做的。


题目:

破解平方数Problem
给出m个数b1, b2,..., bm,每个数的素数因子都在前t个素数之内,任务是寻找这m个数的非空子集的个数x,使得每个子集的乘积都是一个完全平方数。例如t=3,则前3个素数为2, 3, 5。m=4,这4个数为9, 20, 500, 3, 每个数的素因子都是在前3个素数内,则有x=3个非空子集合{9}, {20, 500}, {9, 20, 500},满足每个集合内的数的乘积是一个完全平方数,输出这样的集合的个数。 


Input
每组测试数据的第一行为两个正整数t, m(1 ≤ t ≤ 100, 1 ≤ m ≤ 100) 第二行为m个数, 1 <= bi <= 109 处理至文件结束 
Output
每行输出一个整数x,对应每组测试数据 


Sample Input
3 4
9 20 500 3


Sample Output
3


我的答案:

#include<stdio.h>
#include<math.h>

#define MAX 100
#define SUCCESS 1
#define FAILURE 0

void makePrime(int prime[],int t);
void makeMatrix(char matrix[],int m,int i);
int test(int data[],int prime[],char matrix[],int m,int t);
int isPrime(int prime[],int length,int testNum);
void addArray(int array[],int num,int prime[],int t);

int main()
{
	int t,m;
	int prime[100];
	char matrix[100];
	int data[100];
	int sum = 0;
	int i;
	
	prime[0] = 2;
	
	scanf("%d%d",&t,&m);
	for(i = 0;i < m;i++)
		scanf("%d",&data[i]);
	/*for(i = 0;i < m;i++)
		printf("%d\t",data[i]);*/	
	makePrime(prime,t);
	for(i = 1;i < (int)pow(2,m);i++)
	{
		makeMatrix(matrix,m,i);
		if(test(data,prime,matrix,m,t) == SUCCESS)
			sum++;
	}	
	printf("%d\n",sum);
	return 0;
}

void makePrime(int prime[],int t)
{
	int i = 1;
	int j;
	//int k;
	
	
	for(j = 3;i < t;j += 2)
		if(isPrime(prime,i,j))
		{
			++i;
			prime[i - 1] = j;
		}
	
	/*for(k = 0;k < t;k++)
	{
		printf("%d\t",prime[k]);
	}*/
}

void makeMatrix(char matrix[],int m,int i)
{	
	//化成二进制的函数
	m--;
	for(;m >= 0;m--)
	{
		matrix[m] = i % 2 + '0';
		i /= 2;
		//putchar(matrix[m]);
	}
	//putchar('\n');
}

int test(int data[],int prime[],char matrix[],int m,int t)
{
	int i;
	int array[MAX] = {0};
	
	/*printf("testing ");
	for(i = 0;i < m;i++)
		putchar(matrix[i]);	
	putchar('\n');*/
	//printf("m == %d\n",m);
	for(i = 0;i < m;i++)
		if(matrix[i] == '1')
			addArray(array,data[i],prime,t);
		
		
	/*for(i = 0;i < m;i++)
		printf("%3d",array[i]);
	*/
	for(i = 0;i < m;i++)
	{
		if(array[i] % 2 != 0)
			return FAILURE;	
	}
	return SUCCESS;
	//为什么对于多个1就没用了?
}

int isPrime(int prime[],int length,int testNum)
{
	int i;
	
	for(i = 0;i < length;i++)
	{
		if(testNum % prime[i] == 0)
			return 0;
	}
	return 1;
}

void addArray(int array[],int num,int prime[],int t)
{
	int i;
	for(i = 0;i < t;i++)
	{
		while(num % prime[i] == 0)
		{
			array[i]++;
			//printf("%d++\n",i);
			if(num >= prime[i])	
				num = num / prime[i];
			//else
			//	break;
		}		
	}
}

PS:我感觉这个题目的数据是有问题的,如果真的测试数据t和m到了100的话,那么程序会测试2的100次方个数据,这是个相当大的数据。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值