C++第二次上机实践题目

C++第二次上机实践题目,第1张

C++第二次上机实践题目

一.埃氏筛法求素数

        思想:将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,它不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样反复 *** 作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn)。

1.要设置两个数组

         int prime[maxn];        //保存素数
         int is_prime[maxn]={0};        //is_prime判断是否为素数,元素全部赋值为0为了标志。      

                                                        1:标志着这个数是i的倍数。

 2.Find_prime里的 *** 作:

        1)int p=0为prime[]数组的下标 

        2)for循环从i=2开始,进去时要判断is_prime[i]是素数(即is_prime[i]==0),

                                                                  是则保存到prime[p]=i;        

                紧接着for循环(j=2*i;j

int Find_prime()
{
	int i,j;
	int p=0;//p为prime[]数组的下标 
	for(i=2;i 

3.输入的数不包括0(例:1——100)

        代码完全一样!自己取prime[0]={0,......}

#include 
using namespace std;
#define maxn 101  //包括0 
int prime[maxn];//保存素数
int is_prime[maxn]={0};//判断是否为素数 

int Find_prime()
{
	int i,j;
	int p=0;//p为prime[]数组的下标 
	for(i=2;i 

  二.快速排序

        1.思想:每次排序的时候设置一个基准点(选择最左边的第一个数字),将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。

        2.注意: 

                 1)必须有递归的边界条件,否则跳不出函数!!

                 2)当基准数选择最  左  边的数字时,那么就应该先从  右  边开始搜索

                 【因为最后要停在数值小的i上,然后与基准数交换。如果先从左边搜索,最后i==j时停在比基准数大(因为右边是搜索大于基准数的数)的位置,再基准数交换,这样数值大的i就被放在前面了】

#include 
using namespace std;

void QuickSort(int left,int right,int *a)
{
	if(left>=right) return;//递归边界条件 (因为最后只剩一个元素,left=0,right=-1) 
	int i,j,base,temp;
	i=left,j=right;
	base = a[left];
	while(i=base&&i 

        3.对比冒泡排序法、选择排序法

                1)冒泡排序法:相邻元素两两比较,每次可确定一个最值。

for(i=1;ia[j+1])     //相邻元素比较,逆序则交换
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}

                2)选择排序法:每趟选出一个最值,确定其在结果序列中的位置

for(i=0;ia[j])     //若后面的数j更小,则记住此时j的下标
                min=j;
		}
        if(min!=i)				//说明第一个数不是最小数,所以将a[i]和a[j]交换位置
        {
            t=a[min];
            a[min]=a[i];
            a[i]=t;
        }
    }

四.将M进制的数X转换为N进制输出

#include 
#include 
using namespace std;

int zhuanhuanTen(int m,int x)
{
	int i,r,Ten=0,k=0;
	while(x){
		r=x%10;
		Ten = Ten+r*pow(m,k);
		k++;
		x/=10;
	}
	return Ten;
}

void zhuanhuanN(int Ten,int n)
{
	int i=0,r[111];
	while(Ten){
		r[i]=Ten%n;
		Ten/=n;
		i++;
	}
	for(int j=i-1;j>=0;j--){
		cout<>m>>n>>x;
	Ten = zhuanhuanTen(m,x);
	zhuanhuanN(Ten,n);
	return 0;
}


三.给出年分m和一年中的第n天,算出第n天是几月几号

        1.闰年判定:能被400整除,或者能被4整除但不能被100整除。

                             if(  year%400==0  ||  (year % 4 == 0 && year % 100 != 0)   )

          闰年平年区别:闰年2月份有29天,平年2月份28天。

        2.c++中不能遍历enum中的所有值。

            要遍历所有值,首先想到用数组

#include 
using namespace std;

int Run(int m)
{
	int flag=0;
	if(m%400==0||(m%4==0&&m%100!=0)) flag=1;
	return flag;
}

void jisuan(int *a,int n)
{
	int i,surply=0,sum=0;
	for(i=0;i<12;i++){
		sum+=a[i];
		if(n-sum<0){
			surply=n-(sum-a[i]);
			i=i-1;
			cout<>m>>n;
	flag=Run(m);
	if(flag){
		jisuan(a,n);
	}
	else{
		a[1]=28;
		jisuan(a,n);
	}
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5097443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存