=====
abcde / fghij = n
题目:输入正整数n,按从小到大的顺序输出所有形如”abcde / fghij = n”的表达式,其中a~j恰好为0~9的一个排列,2<=n<=79.
样例输入:
61
62
样例输出:
There are no solutions for 61.
79546 / 01283 =62
94736 / 01528 =62
思路:因为比值n是确定的,所以只需对分母枚举,通过n求得分子,再判断分子分母是否符合提议。
注意:这里为什么不对分子枚举呢,是因为如果枚举分子,那么求分母时需要用到除法。int除以int求int是不准确的,但是int乘以int肯定是int(不溢出的情况下)。
#include<stdio.h>
#include<string.h>
int main()
{
int n,fz,fm,s,t=0;
int m[10]={
0,1,2,3,4,5,6,7,8,9};
int p[10];
while(scanf("%d",&n)!=EOF&&n)
{
int flag=0;
if(t++) printf("\n");
for(fm=1234;fm<=49483;fm++) //分母最大为49483是因为分子最大是98765,比值最小是2
{
fz=fm*n; //通过分母和比值求出分子
if(fz<=98765) //分子满足范围(分子肯定大于1234)
{
s=0; //每次对分子匹配时,s都要初始化为0
/*得到组成分子分母的数字*/
p[0]=fz/10000;
p[1]=(fz/1000)%10;
p[2]=(fz/100)%10;
p[3]=(fz/10)%10;
p[4]=fz%10;
p[5]=fm/10000;
p[6]=(fm/1000)%10;
p[7]=(fm/100)%10;
p[8]=(fm/10)%10;
p[9]=fm%10;
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(p[j]==m[i])
{
s++; //若0~9的数字在p数组内出现,计数加一
break;
}
}
}
if(s==10) //0~9的数字都在p数组内出现,说明满足互不相等
{
flag=1; //标志n有可以满足其的表达式
printf("%05d / %05d = %d\n",fz,fm,n);
}
}
}
if(flag==0) //若n没有可以满足其的表达式
printf("There are no solutions for %d.\n",n);
}
}
=====
有序数列的区间最大乘积
题目:给定整数序列S = {S1,S2,…, 。 。 ,Sn},确定一个该序列内的区间,使区间内所有数相乘所得的s最大。若s不是一个正数,则s=0;
样例输入:
3
2 4 -3
5
2 5 -1 2 -1
样例输出:
Case #1: The maximum product is 8.
Case #2: The maximum product is 20.
思路:因为该集合S是一个序列,所以只需知道区间的起点与终点,就能确定区间。通过枚举起点与终点,不断把区间内所有数相乘的乘积,与s(初始值为0)进行大小的比较。若乘积大于s,则将乘积赋值给s。
注意:s初始值为什么是0呢?根据题意,若最大的区间乘积是负数,则s为0。当最大乘积为负数时,与s相比肯定是小于的,这样,最后要求得的s必然就是初始值0,符合题意。
#include<stdio.h>
int a[100],t=0;
int main()
{
int n;
long long int ss,s; //ss是当前区间内所有数相乘的乘积,s是最大乘积
while(scanf("%d",&n)!=EOF&&n)
{
t++;
s=0;
for(int u=0;u<n;u+