博文
循环链表(用来实现报数)(2007-02-03 22:03:00)
摘要:#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TYPE struct stu
/* 有n给人站成一圈,分辨编号1``n,以k报数, 每报到k的人退出队列,然后继续从下一人开始报数,依次循环*/
/* 知道剩下的人等于k-1,求最后剩下的人的原来编号 */
struct stu
{
int flag;
struct stu *next;
};
/* f函数功能:建立循环链表! */
TYPE *f ( int k, int *n )
{
TYPE *p1,*p2,*head; //定义头指针及结点指针
int i; //控制数
head = NULL; //表头置空
for( i = 1 ; i <= k ; i++ ) //循环创建
{
 ......
二进制数转换为十进制数(2007-01-24 15:22:00)
摘要:#include <stdio.h>
#include <stdlib.h>
#define SIZE 16
//将十进制数转换成二进制数
int main()
{
int i,j,k;
int count=0;
int a[SIZE] = {0};
printf("输入十进制数:");
scanf("%d",&i);
while(i!=0)
{
a[count++] = i%2;
i = i/2;
}
for(j=0;j<SIZE/2;j++)
{
k = a[j];
&nb......
十进制数转换为二进制数(2007-01-24 15:20:00)
摘要:#include <stdlib.h>
#include <stdio.h>
#define SIZE 32
//输入二进制数,转为十进制数
int main()
{
void f(int b[],int n); //求乘积
int fun(int n); //首位置换
char ch;
int i = 0,a[SIZE] = {0},j;
unsigned int s = 0;
printf("输入二进制数:");
while((ch=getchar())!='\n') //输入二进制数
{
if(ch=='1')
a[i++] = ch-48;
else if(ch=='0')
a[i++] = ch-48;
 ......
万年历(2006-12-30 13:29:00)
摘要:#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define TURE 1
#define FALSE 0
int week(int *p1,int *p2,int *p3);
int data(int *p1,int *p2);
int Aurthorware(int year);
/*Aurthorware函数,用以查询该年是否为闰年*/
int Aurthorware(int year)
{
int result;
if((year%4==0&&year%100!=0)||(year%4==0&&year%400==0))
result = TURE;
else
result = FALSE;
return result;
}
int data(int *p1,int *p2)
{
int month[13] = {31,28,31,30,31,30,31,31,30,31,30,31};
int i=1,k,j;
if(Aurthorware(*p1))
month[1]+=1;
printf(" Sun Mon Tur Wed Thu Fri Sat \n");
k = week(p1,p2,&i);
......
求n(n>0)以内的素数,并输出最大的素数(2006-12-25 17:24:00)
摘要:#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*1-n的素数并且求这些素数的和,还有这些素数中的最大值*/
int main()
{
int i,total=0,j=0,k,max,num[2000];
int a,n;
printf("please input n(2000>n>0)");
scanf("%d",&n);
for(i=2;i<n;i++)
{
a=1; //每次给a复位
for(k=2;k<=sqrt(i);k++)
if(i%k==0)
{
a=0;
break;
&nbs......
卡布列克常数(2006-10-08 12:41:00)
摘要:83.卡布列克常数
验证卡布列克运算。任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位);
3)求两个数的差,得到一个新的四位数(高位零保留)。
重复以上过程,最后得到的结果是6174,这个数被称为卡布列克数。
*问题分析与算法设计
题目中给出的处理过程很清楚,算法不需要特殊设计,可按照题目的叙述直接进行验证。
*程序与程序注释
#include<stdio.h>
void vr6174(int);
void parse_sort(int num,int *each);
void max_min(int *each,int *max,int *min);
void parse_sort(int num,int *each);
int count=0;
void main()
{
int n;
printf("Enter a number:");
scanf("%d", &n); /*输入任意正整数*/
vr6174(n); /*调用函数进行验证*/
}
void vr6174(int num)
{
int each[4],max,min;
if(num!=6174&&num) /*若不等于74且不等于0则进行卡布列克运算*/
{
parse_sort(num,each); /*将整数分解,数字存入each数组中*/
max_min(each,&max,&min); /*求数字组成的最大值和最小值*/
num=max-min; /*求最大值和最小值的差*/
printf("[%d]: %d-%d=%d\n",++count,max,min,num); /*输出该步计算过程*/
vr6174(num); /*递归调用自身继续进行卡布列克运算*/
}
}
void parse_sort(int n......
joseph问题(2006-09-24 13:34:00)
摘要:Joseph问题
题目描述:
原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k(0 < k <14)。
输出:
使得最先出列的k个人都是坏人的m的最小值。
输入样例:
4
输出样例:
30
程序:
#include "stdio.h"
long k, m, begin;
int check(long remain)
{
long result = ( begin+m-1 ) % remain;
if (result>=k)
{begin = result; return 1;}
else return 0;
}
main()
{
long i, find = 0;
FILE *fp,*fp1;
fp=fopen("d:\\a.txt","r");
fp1=fopen("D:\\b.txt","w");
fscanf(fp,"%ld", &k);
for (m = k;!find; m++)
{
find = 1; begin = 0;
for (i = 0; i < k; i++)
if (!check(2*k-i))
&nbs......
