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;
}