大一上期末复习22/01/03

1.求水仙花数
算法:暴力,枚举
题目:水仙花数是指一种三位数,其各个数之立方和等于该数。列出100-999内所有水仙花数。
思路:按照题意写循环。对每个数,先分离各个位的数字→求立方和→判断是否等于该数。如果是,输出。
C语言风格:

//one
#include<stdio.h>
int main(){
    int x,y,z,i;
    for(i=100;i<=999;i++){
        x=i/100;
        y=(i-100*x)/10;
        z=i%10;
        if((x*x*x+y*y*y+z*z*z)==i)
            printf("%d ",i);
    }
    return 0;
}

//two
#include<stdio.h>
#include<math.h>
int main(){
    int x,y,z,i;
    for(i=100;i<=999;i++){
        x=i/100;
        y=(i-100*x)/10;
        z=i%10;
        if((pow(x,3)+pow(y,3)+pow(z,3))==i)
            printf("%d ",i);
    }
    return 0;
}

C++语言风格:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int x,y,z,i;
    for(i=100;i<=999;i++){
        x=i/100;
        y=(i-100*x)/10;
        z=i%10;
        if((pow(x,3)+pow(y,3)+pow(z,3))==i)
            cout<<i<<' ';
    }
    return 0;
}

输入:无
输出:153 370 371 407

2.求质数
算法:数论-素数筛
题目:列出1-100之内所有质数。
质数:因子仅有1和它本身。
对算法的优化:2是最小的质数,不必从1开始枚举;一个合数,最大的因子是它的平方根。(减少了枚举量,节省了代码运行的时间和空间)
C语言风格:

#include<stdio.h>
#include<math.h>
int main(){
    int flag=0,i,j;
    for(i=2;i<100;i++){
    	flag=0;//不要忘记,每次判断之后要将标记变量flag归零
		for(j=2;j<=sqrt(i);j++){
        if(i%j==0)
            flag++;
    }
    if(flag==0)	
    	printf("%d ",i);
	}
    return 0;
}

C++语言风格:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int flag=0,i,j;
    for(i=2;i<100;i++){
    	flag=0;
		for(j=2;j<=sqrt(i);j++){
        if(i%j==0)
            flag++;
    }
    if(flag==0)	
    	cout<<i<<' ';
	}
    return 0;
}

输入:无
输出:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

3.ASCII与大小写
输入一个大写字母,输出其对应小写字母和小写字母的ASCII码。
算法:模拟
分析:ASCII码,大写字母的比小写字母的小32。
C语言风格:

#include<stdio.h>
#include<math.h>
int main(){
    char ch;
	int x;
    scanf("%c",&ch);
    ch+=32;
    x=(int)ch;	
    	printf("%c %d",ch,x);
    return 0;
}

C++语言风格:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    char ch;
	int x;
    cin>>ch;
    ch+=32;
    x=(int)ch;	
    	cout<<ch<<' '<<x;
    return 0;
}

输入:A
输出:a 97

4.二维数组右移一列,最后一列移动到0列
题目:一个4行3列数组,对所有元素右移一列,最后一列元素移到0列。
算法:模拟
分析:按题意要求即可,注意数组从0行0列开始。多开一列,暂时存储最第3列。
建议动手推演
C语言风格:

#include<stdio.h>
#include<math.h>
int main(){
    int a[4][4];
	for(int i=0;i<=3;i++)//line
		for(int j=0;j<=2;j++)//column
    scanf("%d",&a[i][j]);
    for(int i=0;i<=3;i++)//存储最后一列 
    	a[i][3]=a[i][2];
	for(int i=0;i<=3;i++)
		for(int j=1;j>=0;j--)//j减少,防止覆盖 
			a[i][j+1]=a[i][j];
	for(int i=0;i<=3;i++)
		a[i][0]=a[i][3];	
    for(int i=0;i<=3;i++)
		for(int j=0;j<=2;j++){ 
		printf("%d ",a[i][j]);
		if(j==2)	printf("\n"); 
		} 
    return 0;
}

C++语言风格:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int a[4][4];
	for(int i=0;i<=3;i++)//line
		for(int j=0;j<=2;j++)//column
    cin>>a[i][j];
    for(int i=0;i<=3;i++)//存储最后一列 
    	a[i][3]=a[i][2];
	for(int i=0;i<=3;i++)
		for(int j=1;j>=0;j--)//j减少,防止覆盖 
			a[i][j+1]=a[i][j];
	for(int i=0;i<=3;i++)
		a[i][0]=a[i][3];	
    for(int i=0;i<=3;i++)
		for(int j=0;j<=2;j++){ 
		cout<<a[i][j]<<' ';
		if(j==2)	cout<<endl; 
		} 
    return 0;
}

输入:(略)
输出:(略)

5.数列
1)1-100 an=n;
2)1-100, an=n(-1)^(n+1)
算法:模拟
分析:可以用循环求,也可以用有关公式;也可以在纸上手算出答案,代码中只写一个输出。
C语言风格:

#include<stdio.h>
#include<math.h>
int main(){
    int i,sum;
		for(i=1;i<=100;i++)
			sum+=i;
	printf("%d",sum);
    return 0;
}

C++语言风格:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int i,sum;
		for(i=1;i<=100;i++)
			sum+=i;
	cout<<sum;
    return 0;
}

输入:无
输出:5051

6.打折
(忘了题干长啥样了,略)
算法:
分析:
优化:
C语言风格:

C++语言风格:

7.一维数组折半查找
输入1个长度为n的升序数组,查找其中的元素x并输出x的数组下标。
算法:折半查找
C语言风格:

#include<stdio.h>
#include<math.h>
int a[233],n,mm,x,ans;
int bina(int a[], int n, int x){
	int low=0,high=n-1,mid;
	while(low<high){
		mid=(low+high)/2;
		mm=a[mid];
		if(mm<x)	low=mid+1;
		else if(mm>x)	high=mid-1;
		else return mid;
	}
}
int main(){
	scanf("%d",&n);
    for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&x);
	ans=bina(a,n,x);
	printf("%d",ans);
    return 0;
}

C++语言风格:

8.最大最小
输入10个正整数,找出其中的最大值和最小值
算法:模拟
分析:挨个比较
优化:
C语言风格:

//数组 
#include<stdio.h>
#include<math.h>
int a[233],maxn,minn;
int main(){
    for(int i=0;i<10;i++)
		scanf("%d",&a[i]);
		maxn=a[0],minn=a[0];
	for(int i=1;i<10;i++){
		if(a[i]>maxn)	maxn=a[i];
		if(a[i]<minn)	minn=a[i];
	}
	printf("maxn=%d minn=%d",maxn,minn);
    return 0;
}

C++语言风格:

C++语言风格:

9.韩信点兵问题
韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按从1至7报数,记下最末一个士兵报的数为4; 最后按从1至11报数,最末一个士兵报的数为10; 请编写程序计算韩信至少有多少兵。
算法:模拟
分析:
C语言风格:

#include "stdio.h"
void count(){
	for(int n=1;;n++){
		if((n%11==10)&&(n%7==4)&&(n%6==5)&&(n%5==1)){
			printf("%d\n",n);
			break;
		}
	}
}
int main(){
	count();
	return 0;
}

C++语言风格:

10.辗转相除求gcd(最大公约数)
算法:数论-辗转相除
分析:
C语言风格:

#include <stdio.h>
int main() {
	printf("输入需要取最大公约数的两位正整数:"); 
	int x,y,z;
 	scanf("%d %d",&x,&y);
 	if(x<y){//如果x<y,交换
 	int tmp;
 		tmp=x;
 		x=y;
 		y=tmp;
 	}
 	z=x%y;
 	while(z!=0) {//while循环,当z余数不为0时开始循环,当z为0时跳出循环体,并打印结果
  		x = y;  //将上一个除数赋值为被除数
  		y = z;  //将上一个余数赋值为除数
  		z =x%y; //开始取余
 	}
 printf("%d" ,y);
 return 0;
}

C++语言风格:

11.指针法求10个正整数中最大数最小数
算法:
分析:
优化:
C语言风格:

#include<stdio.h>
int main(){
    int a[10], i, max, min, * p;
    p = a;
    for (i = 0; i < 10; i++)
        scanf("%d", p++);
    max =[0], min = a[0];
    for (p = a; p < a + 10; p++){
        if (*p > max)
            max = *p;
        if (*p < min)
            min = *p;
    }
    printf("max=%d\n", max);
    printf("min=%d\n", min);
    return 0;
}

C++语言风格:

12.数组判断奇偶性
算法:模拟
分析:求余运算,分离奇数偶数。开三个数组:原数组、奇数组、偶数组
优化:
C语言风格:

#include<stdio.h>
int a[10],ji[10],ou[10];
int main(){
    for(int i=0;i<10;i++){
		scanf("%d",&a[i]);
	}
	int flag1=0,flag2=0,count=0;
	while(count<10){
		if(a[count]%2)	
			ji[flag1]=a[count],flag1++;
		else ou[flag2]=a[count],flag2++;
		count++;
	}
	for(int i=0;i<10;i++){
		if(ji[i]!=0) printf("%d ",ji[i]);
		else{
			printf("\n");
			break;
	}
		} 
	for(int i=0;i<10;i++){
		if(ou[i]!=0) printf("%d ",ou[i]);
		else {
			printf("\n");
			break;
		} 
	}
    return 0;
}

C++语言风格:

13.排序:交换(指针)、冒泡
算法:
分析:
优化:
C语言风格:

#include<stdio.h>
void swap(int*,int*);
int main(){
	int a=1,b=2;
	int*pa,*pb;
	pa=&a;pb=&b;
swap(pa,pb);
	return 0;
}
void swap(int*p1 ,int *p2){
	int temp;
	temp=*p1;
	*p1=*p2 ;
	*p2=temp ;
}

//冒泡排序:

//2.0基本冒泡排序
for(int i=1;i<=n-1;i++)
	for(int j=1;j<=n-i;j++)
	if(a[j]<a[j+1]){
		int tmp=a[j];
		a[j]=a[j+1];
		a[j+1]=tmp;
	}
//2.1改进冒泡排序
bool bo;
int i=1;
do{
	bo=true;
	//for(int i=1;i<=n-1;i++)
		for(int j=1;j<=n-i;j++)
			if(a[j]<[j+1]){
				int tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
				bo=false;
				}
				i++;
			}while(!bo);
上一篇:[转]解决win8.1右键菜单出现在左边


下一篇:JAVA寒假03