一:最大最小值问题
a>在一个数据集合中(a[10]),没有重复值,有正有负。
求正数中的次大次小;
求负数中的次大次小
int max1,max2,fmax1,fmax2,i;
max1=max2=fmax1=max2=0;
for(i=0;i<10;i++){
if(a[i]>0){
if(a[i]>max1){
max2=max1;
max1=a[i]
}
else if(a[i]>max2)
max2=a[i];
}
else if(a[i]<0){
if(!fmax1){
fmax1=fmax2=a[i];
}
else if(a[i]>fmax1){
fmax2=fmax1;
fmax1=a[i]
}
else if(fmax1==fmax2)
fmax2=a[i];
else if(a[i]>fmax2)
fmax2=a[i];
}
}
b>在一个数据集合中(a[10]),没有重复值,有正有负
在数组中求一个连续子集,使得和值最大
int i,k,max,tempmax;//max为最大和值,k为该连续子集最后一个元素的下标
max=tempmax=0;
for(i=0;i<10;i++){
if(tempmax+a[i]>0){
tempmax+=a[i];
if(tempmax>max){
max=tempmax;
k=i;
}
}
else
tempmax=0;
}
二:设数据集合a{2,3,5,7,8};数据集合b{3,4,6,7,8,9,10,12};均为升序;
将a与b合并成一个升序并去除重复值
int ab{N},i,j,k;\\N为常数(足够大)
i=j=0=k;
while(i<5||j<8){
if(i<5&&j<8){
if(a[i]<a[j])
if(ab[k-1]!=a[i])
ab[k++]=a[i++];
else
i++;
else{
if(ab[k-1]!=a[j])
ab[k++]=a[j++];
else
j++;
else if(i<5)
if(ab[k-1]==a[i])
i++;
else
a[k++]=a[i++];
else if(j<8)
if(ab[k-1]==b[j])
j++;
else
a[k++]=a[j++];
}
for(i=0;i<k;i++)
printf("%d\t"ab[k]);
三:任何一个大于1正整数可分解为若干个素数之积。要求编一个程序,输入一个正整数,输出该正整数的所有因数。
#include<stdio.h>
int main()
{
int i,j,n;
printf("请输入一个正整数");
scanf("%d",&n);
i=2;
while(n!=1){
while(n%i==0){
n/=i;
printf("%d\t",i);
}
i++;
}
}
四:任意输入正整数x,y(x,y>2)
输出最小公倍数和最大公约数
#include<stdio.h>
int main()//穷举法
{
int x,y,i,k;
printf("请输入两个正整数:");
scanf("%d%d",&x,&y);
for(k=x<y?x:y;k>1&&(x%k+y%k);k--);//将k赋值为x与y中最小值,并使得k递减,当k第一次满足同时为x与y的公约数时,停止循环,此时k最大
printf("最大公约数为%d,最小公倍数为%d",k,x*y/k);
}