2015年复试算法题

1、判断给定序列是否是等差数列

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int key;
	struct node* next;
}Linklist;
int mySort(int array[],int n){
	int i,j;
	int temp;
	for(int i=0;i<n-1;i++){
		for(j=i+1;j<n;j++){
			if(array[i]>array[j]){
				temp=array[i];
				array[i]=array[j];
				array[j]=temp;
			}
		}
	}
}
int main(){
	int n;
	int i,j;
	Linklist* head,*p,*q;
	head=(Linklist*)malloc(sizeof(Linklist));
	head->next=NULL;
	p=head;
	while(1){
		scanf("%d",&n);
		if(n==0){
			p=head->next;
			while(p!=NULL){
				if(p->key==0){
					printf("0\n");
				}
				else if(p->key==1){
					printf("yes\n");
				}
				p=p->next;
			}
			break;
		}
		int array[n];
		for(i=0;i<n;i++){
			scanf("%d",&array[i]);
		}
		mySort(array,n);
		int num=array[1]-array[0];
		q=(Linklist*)malloc(sizeof(Linklist));
		q->next=NULL;
		for(i=1;i<n;i++){
			if((array[i]-array[i-1])!=num){
				q->key=0;
				break;
			}
		}
		if(i==n){
			q->key=1;
		}
		p->next=q;
		p=q;
	}
	return 0;
} 

2、判断是否为水仙花数

水仙花数是指一种三位数,其各个数之立方和等于该数

#include<stdio.h>
#include<stdlib.h>
int main(){
	int n,a,b,c;
	scanf("%d",&n);
	a=n%10;
	b=n/10%10;
	c=n/100;
	if((a*a*a+b*b*b+c*c*c)==n){
		printf("yes\n");	
	}else{
		printf("NO\n");
	}
	
}

3、Arold变换

Arnold变换是一种常见的图像置乱技术,Arnold变换定义如下: //对任意NN矩阵(素有元素相同的矩阵除外)设i,j为矩阵元素的初始下标,经过Arnold变换后行下标为i’,j’,其满足下式:
i’=(i+j)mod N 
j’=(i+2j)mod N i,j:0,1,…N-1
Arnold变换具有周期性,即经过若干次变换回到最初状态,且周期T与N的大小有关。
对于任意N>2,Tn<=nn/2,请编写程序求出Tn。
输入说明:对输入的每一个N,给出N*N矩阵的Arnold变换的周期T
输入样本:
3
8
0
输出样本
4
6
分析:

#include<stdio.h>
int Arnold(int n);
struct node{
	int x;
	int y;
};
int main(){
	int n,count;
	int i,index;
	int result[100];
	index=0;
	while(1){
		scanf("%d",&n);
		if(n==0){
			break;
		}
		result[index++]=Arnold(n); 
	}
	for(i=0;i<index;i++){
		printf("%d\n",result[i]);
	}
	return 0;
}
int Arnold(int n){
	int i,j,k;
	int max,count,temp;
	max=n*n/2;
	i=0;
	j=1;
	count=0;
	for(k=0;k<max;k++){
		temp=(i+j)%n;
		j=(i+2*j)%n;
		i=temp;
		count++;
		if(i==0&&j==1){
			break;
		}
	}
	return count;
}

4、判断输入数是否是Smith数

如果它的各位之和等于它的所有质因数的各位之和,则该数被称为Smith数
4937775=3×5×5×65837,然后再把4937775所有质因数各位上的数字相加得:3+5+5+6+5+8+3+7=42,接着他又把4937775各位上的数字相加得:4+9+3+7+7+7+5=42

#include <stdio.h> 

//一个简单的求和函数,可以将数字分隔开然后进行求和 
int add(int n){
    int sum = 0;
    while(n){
		sum += n%10;
		n /= 10;
	}
    return sum;
}

//判断是否为Smith数 
//在这个函数中也同时添加了判断质数的代码,将其整合在了一起 
bool smith(int n) {
	//设置一个数组来存放质因数
    int a[10000] = {0};
    int i = 2;
    int temp = n;
    int index = 0; 
    int sum1 = 0;//sum1存放质因数分解的和 
    //注意这里有等号,也就是说,至少会有一个数字,也就是它本身会存入a数组中,为后续判断做了铺垫
    while (i <= temp) {
    	//从小到大开始算质因数
		//不断的除以2,直到不能整除,然后i++开始除以3...以此类推 
        if (temp%i == 0) {
            a[index] = i;
            index++;
            temp /= i;
            i = 2;
        }
        else i++;
    }
    //也就是说,该数为质数,不满足Smith数必须是合数的条件,直接返回false进行下一个数的判断 
    if(a[1] == 0) return false; 
    //该数不为质数,也就是合数,满足了Smith数最基本的条件,然后看质因数和与各个位数之和是否相等 
	else{
		//这里很巧妙的解决了测试样例中4937775 = 3*5*5*65837中65837的分解
		//如果a数组(存放质因数的数组)中有非一位数的数,则须对数字继续分解 
    	for (int i = 0; a[i]!=0; i++){
            a[i] = add(a[i]);
            sum1 += a[i];
        }
        //sum2中存放数字各个位数的和 
        int sum2 = add(n);
        //如果和相等,则说明该数就为Smith数,返回true,最后在主函数中打印 
        if (sum1 == sum2)return true;
        else return false;
	}
}

int main(){
    int n;
	int i = 0;
    scanf("%d", &n);//输入一个数 
    //从n+1开始判断是否为Smith数 
    
		
        if(smith(n)){
            printf("yes\n");
            
            
        }
        else{
        	printf("NO\n");
    	}
		
    
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值