一些个常用小算法习题

1、10000以内的完数

#include <stdio.h>
int main(int argc, char* argv[])

{
    int i,j,s,sum;
sum=0;
for(i=2;i<=1000;i++)
{
s=0;
for(j=1;j<i;j++)
{
if(i%j==0)    //这一块是如果能够整除,那么就是该数的因子,我们累加起来
{
s+=j;
}
}
if(s==i)      //因子的和与原数比较,如果正确就输出
{
printf("%d\n",i);
sum++;
}
}
printf("完数的个数:%d\n",sum);
      return 0;
}
--------------------- 

2、求三位数对称素数

/*
* 问题描述:找出3位数对称素数
* 如101就是,787也是,896不是
* 是的话输入YES,否则输出NO
* xtfggef 2012/5/16
*/
#include<iostream>
#include<cmath>
using namespace std;
 
bool isPrime(int);
int main(int argc, char * argv[])
{
	int n;
	cin >> n;
	//核心
	cout << (n>100&&n<1000&&n/100==n%10&&isPrime(n)?"YES\n":"NO\n");
	return 0;
}
/*
* 判断是否是素数
*/
bool isPrime(int n)
{
	int sqr = sqrt(n*1.0);
	for(int i=2; i<=sqr; i++)
	{
		if(n%i==0)
			return false;
	}
	return true;
}

3、求两个数的最大公约数

#include <stdio.h>
int a, b, temp;
//辗转相除法实现 
int Division(){
    printf("请输入两个数(a,b):\n");
    scanf("%d,%d",&a,&b);
    if(a < b){
        temp = a;
        a = b;
        b = temp;
        
    }
    while(a%b != 0){
            temp = a%b;
            a = b;
            b = temp;
    }
    printf("最大公约数为:%d\n",b);
    return 0;
} 
//相减法实现 
int Subtract(){
    printf("请输入两个数(a,b):\n");
    scanf("%d,%d",&a,&b);
    if(a < b){
        temp = a;
        a = b;
        b = temp;
    }
    while(a-b != 0){
            temp = a-b;
            a = b;
            b = temp;
    }
    printf("最大公约数为:%d\n",b);
    return 0;    
}
//穷举法实现 
int Exhaus() {
    printf("请输入两个数(a,b):\n");
    scanf("%d,%d",&a,&b);
    if(a < b) {
        temp = a;
        a = b;
        b = temp;
    }
    for(temp = b; a%temp || b%temp; temp--);
    printf("最大公约数为:%d\n",temp);
    return 0;
}

最小公倍数类似,借助于最小公倍数=X*Y/gcd(X,Y);就OK了。

此处注意:为了使计算不超出范围,最好写成:X/gcd(X,Y)*Y

猴子选大王问题:

public class Test02 {
	//猴子选大王问题
	public static void main(String[] args) {
		//用数组表示淘汰的状态
		boolean[] b=new boolean [15];
		//初始化数组 true表示没淘汰
		for(int i=0;i<b.length;i++){
			b[i]=true;
		}
		//实现那些操作,猴子的剩余数量
		int monkey=15;
	   //报数
		int num=0;
		//控制数组元素往后走,数组下标
		int index=0;
		//循环报数
		while(monkey>1){
			//位淘汰才能报数
			if(b[index]){
				///报数
				num++;
				//num==7淘汰
				if(num==7){
					b[index]=false;
					monkey--;
					num=0;
				}
			}
		    //被淘汰 ---移到下一个元素 
			index++;
			//控制一圈的状态
			if(index==15){
				index=0;
			}
		}
		for(int i=0;i<b.length;i++){
			if(b[i]){
				System.out.println(i+1);
			}
		}	
	}
}

螺旋填数问题:

public class Test03 {
	public static void main(String[] args) {
		// 螺旋填数,数组
		int [][]arr=new int[4][5];
		//定义行和列的变量
		int row=0;//表示坐标问题
		int col=0;
		//
		arr[row][col]=1;
		//控制方向 向右,向下,向左,向上
		int[][] direction={{0,1},{1,0},{0,-1},{-1,0}};
        //二维数组的下标,---控制转向
		int directionindex=0;

		//循环赋值
		for(int i=2;i<=20;i++){
			//得到新的坐标的值
			row=row+direction[directionindex][0];
			col=col+direction[directionindex][1];
			///判断是否越界
			if((row>=4||row<0)||(col>=5||col<0)||(arr[row][col]!=0)){
				//变为上一次的坐标
				row=row-direction[directionindex][0];
				col=col-direction[directionindex][1];
				directionindex++;
				//控制方向循环
				if(directionindex==4){
					directionindex=0;	  
				}
				//得到新的坐标
				row=row+direction[directionindex][0];
				col=col+direction[directionindex][1];
			}
			//给值
			     arr[row][col]=i;
		}
		
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr[i].length;j++){
				System.out.print(arr[i][j]+"\t");
        }
			    System.out.println();
                                                                          
		}
	}
}

Java实现矩阵的转置:

public class Matrix {
 
	public static void main(String[] args) {
		int array[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
		int array2[][] = new int[3][3];
		System.out.println("转置前:");
		for (int i = 0; i < array.length; i++) {
			for (int j = 0; j < array[i].length; j++) {
				System.out.print(array[i][j] + " ");
				array2[j][i] = array[i][j];
			}
			System.out.println();
		}
		System.out.println("转置后:");
		for (int k = 0; k < array2.length; k++) {
			for (int h = 0; h < array2[k].length; h++) {
				System.out.print(array2[k][h] + " ");
			}
			System.out.println();
		}
	}
}

Java实现计算时间差

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class Tiemp {
    public static void main(String args[]){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String s1 = "20080808";
        String s2 = "20080908";
        try {
            Date d1 = sdf.parse(s1);
            Date d2 = sdf.parse(s2);
            System.out.println((d2.getTime() -  d1.getTime())/(3600L*1000)); 
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

判断字符串是否为空:

#include <stdio.h>
#include <stdlib.h>
 
/*判断用户输入的字符串是否为回文
 *回文是指顺读和反读都一样的串
 *例:abccba为回文,abcdab不是回文
*/
 
int Palindrome(const char *str)
{
	int length = strlen(str);
	for(int i = 0; i <= length/2; i++)
	{
		if(str[i] != str[length-i-1])
		{
			return -1;
		}
	}
	return 1;
}
 
int main()
{
	char s[100];
	gets(s);
	int result = Palindrome(s);
	if(result == 1)
	{
		printf("字符串是回文");
	}
	else
	{
		printf("字符串不是回文");
	}
}

字符串转换为整数:

#include<iostream>
#include<string>
#include<assert.h>
 
using namespace std;
 
int str_2_int(string str)
{
	assert(str.size()>0);
	int pos = 0;
	int sym = 1;
 
	if(str[pos] == '+')
		pos++;
	else if(str[pos] == '-')
	{
		pos++;
		sym=-1;
	}
	int num =0;
	while(pos<str.length())
	{
		assert(str[pos]>='0');
		assert(str[pos]<='9');
		num = num*10+(str[pos]-'0');
		assert(num>=0);
		pos++;
	}
	num*=sym;
	return num;
}
int main()
{
	string str = "-1024";
	int num = str_2_int(str);
	cout << num << endl;
	return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值