首页 > 试题广场 >

请编写程序实现以下功能。

[问答题]
约数个数
请编写程序实现以下功能。
(1)从键盘任意输入一个正整数(假设不超过9999),请对该数进行质因数分解。
如输入24,它的质因数分解结果为2*2*2*3,即 2 3 *3 1
再如输入90,它的质因数分解结果为2*3*3*5,即 2 1 *3 2 *5 1
(2)请使用上述质因数的分解结果,计算正整数的约数个数。
计算的方法为:
  • 将每个质因数的幂加1后相乘,(3+1)*(1+1)=8,即24的约数有8个。
  • 再以90为例: 90=2 1 *3 2 *5 1 ,(1+1)*(2+1)*(1+1)=12,于是90共有12个约数
键盘输入:90
屏幕输出:
质因数分解结果为:2^1*3^2*5^1
约数个数为:12
(注: x^y 表示 x的y次方,本括号内的内容不用输出。)
#include<stdio.h>
#include<math.h>
struct node
{
	int yue;
	int num;
};
int fenjie(struct node shuzi[100],int x)
{
	int i1,i2,j=0,n1=0,n2=0;
	for (i1=2;i1<x/2;i1++)
	{
		if (x%i1==0)
		{
			n1=n1+1;
			if (n1==1)
			{
				shuzi[j].yue=i1;
				j=j+1;
			}
			else 
			{
				for (i2=0;i2<j;i2++)
				{
					if (i1%shuzi[i2].yue==0)
						break;
					else 
						n2=n2+1;
				}
				if (n2==j)
				{
					shuzi[j].yue=i1;
					j=j+1;
					n2=0;
				}
			}
		}
	}
	for (i1=0;i1<j;i1++)
	{
		for (i2=1; ;i2++)
		{
			if (x%(int)pow(shuzi[i1].yue,i2)!=0)
				break;
		}
		shuzi[i1].num=i2-1;
	}
	return (j);
}
int cal(struct node shuzi[100],int n)
{
	int number=1,i;
	for (i=0;i<n;i++)
		number=number*(shuzi[i].num+1);
	return (number);
}
void main()
{
	struct node shuzi[100];
	int x,number,n,i;
	scanf("%d",&x);
	n=fenjie(shuzi,x);
	printf("质因数分解结果为:\n");
	for (i=0;i<n;i++)
	{
		printf("%d^%d",shuzi[i].yue,shuzi[i].num);
		if (i!=n-1)
			printf("*");
	}
	printf("\n");
	number=cal(shuzi,n);
	printf("约数个数为: %d\n",number);
}

最大连续子数列和
给出一个数列(元素个数不多于100),数列元素均为负整数、0、正整数。请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,在和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数列在整个数列中的位置。
例如数列为4  -5  3  2  4时,输出“和为9,子数列起始位置为2,结束位置为4”;再比如数列为1  2  3  -5  0  7  8时,输出“和为16,子数列起始位置为0,结束位置为6”。
键盘输入:为两行,第一行为数列元素个数,第二列依次输入各个元素。
7
1 2 3 -5 0 7 8
屏幕输出:
和为16,子数列起始位置为0,结束位置为6
#include<stdio.h>
int seek(int a[100],int n,int *p1,int *p2)
{
	int i1,i2,i3,t1=0,t2=n-1,sum=0,max;
	for (i1=0;i1<n;i1++)
	{
		for (i2=n-1;i2>=i1;i2--)
		{
			for (i3=0;i3<=i2;i3++)
			    sum=sum+a[i3];
			if (i1==0&&i2==n-1)
				max=sum;
			else 
			{
				if (sum>max)
				{
					t1=i1;
					t2=i2;
					max=sum;
				}
				else if (sum==max)
				{
					if (i2-i1>t2-t1)
					{
						t1=i1;
						t2=i2;
					}
				}
			}
			sum=0;
		}
	}
	*p1=t1;
	*p2=t2;
	return (max);
}
void main()
{
	int a[100],t1,t2,n,i,max;
	int *p1,*p2;
	scanf("%d",&n);
	fflush(stdin);
	for (i=0;i<n;i++)
		scanf("%d",&a[i]);
	p1=&t1;
	p2=&t2;
    max=seek(a,n,p1,p2);
	printf("和为%d,子数列起始位置为%d,结束位置为%d\n",max,t1,t2);
}


发表于 2017-05-17 02:26:05 回复(0)