#include <stdio.h>
//约瑟夫问题
问题概述:有m个人循环数数,将第n个人打印出来。
int main()
{
int a[100]={0};
int m;//总人数
int n;//第几个人出列
printf("input m:\n");
scanf("%d",&m);
printf("input n:\n");
scanf("%d",&n);
int i=0;//数组下标
int k=0;//循环计数器
int count=m;//记录还剩下几个人
//先将数组a赋初值
for (i=0;i<100;i++)
{
a[i]=i+1;
}
i=0;
while (count>0)//如果还剩下人
{
//数到符合条件的那个人
for (k=0;k<n;k++)
{
if(i >= m ) i=0;
if(a[i++]==0) {k--;}
}
//将符合条件的人打印出来
printf("%d\t",a[i-1]);
a[i-1]=0;
count--;
}
return 0;
}
#include <stdio.h>
char c[16][16]={'\0'};
int wflag=0;//胜利或者失败标志,0为失败,1为成功
void hjudge(int h,int l);
void ljudge(int h,int l);
void x1judge(int h,int l);
void x2judge(int h,int l);
void init()//初始化棋盘
{
int i,j;
for (i=1;i<16;i++)
{
for (j=1;j<16;j++)
{
c[i][j]='#';
}
}
}
void pt()//打印棋盘
{
int i,j;
printf(" ");
for(j=1;j<16;j++)
printf("%x ",j);
printf("\n");
for (i=1;i<16;i++)
{
printf("%x ",i);
for (j=1;j<16;j++)
{
printf("%c ",c[i][j]);
}
printf("\n");
}
}
int chartodigi(char c)//将输入的字符坐标转化成相应的数字坐标
{
if (c<='9' && c>='1')
{return c-'0';
}
if (c<='f' && c>='a')
{return c-87;
}
return 0;
}
void play1()//棋盘1放置
{
char rol='0',col='0';int h=0,l=0;
while ( 1 )
{
fflush(stdin);
printf("请输入你要输入的位置(*):\n");
scanf("%c%c",&rol,&col);
h=chartodigi(rol);l=chartodigi(col);
if (c[h][l]=='o' || c[h][l]=='*')
{printf("你输入的位置已经有棋子了 ,请重新输入(*)!\n"); continue;}
if (c[h][l]=='#') {c[h][l]='*';break;}
printf("你输入的位置不对 ,请输入正确的位置(*)[1-9][a-f]\n");
}
hjudge(h,l);ljudge(h,l);x1judge(h,l);x2judge(h,l);
}
void play2()//棋盘2放置
{
char rol='0',col='0';int h=0,l=0;
while ( 1 )
{
fflush(stdin);
printf("请输入你要输入的位置(o):\n");
scanf("%c%c",&rol,&col);
h=chartodigi(rol);l=chartodigi(col);
if (c[h][l]=='o' || c[h][l]=='*')
{printf("你输入的位置已经有棋子了 ,请重新输入(o)!\n"); continue;}
if (c[h][l]=='#') {c[h][l]='o';break;}
printf("你输入的位置不对 ,请输入正确的位置(o)[1-9][a-f]\n");
}
hjudge(h,l);ljudge(h,l);x1judge(h,l);x2judge(h,l);
}
//横判断的标志
void hjudge(int h,int l)
{
int cnt=0;
while (c[h][l]==c[h][l-1] && l>=2) l--;
while (c[h][l]==c[h][l+1] && l<=15) {l++;cnt++;}
if (cnt>=4)
wflag=1;
}
//横判竖的标志
void ljudge(int h,int l)
{
int cnt=0;
while (c[h][l]==c[h-1][l] && h>=2) h--;
while (c[h][l]==c[h+1][l] && h<=15) {h++;cnt++;}
if (cnt>=4)
wflag=1;
}
//2,4象限判断
void x1judge(int h,int l)
{
int cnt=0;
while (c[h][l]==c[h-1][l-1] && h>=2 && l>=2) {h--;l--;}
while (c[h][l]==c[h+1][l+1] && h<=15 && l<=15) {h++;l++;cnt++;}
if (cnt>=4)
wflag=1;
}
//1,3象限判断
void x2judge(int h,int l)
{
int cnt=0;
while (c[h][l]==c[h-1][l+1] && h>=2 && l<=15) {h--;l++;}
while (c[h][l]==c[h+1][l-1] && h<=15 && l>=2) {h++;l--;cnt++;}
if (cnt>=4)
wflag=1;
}
int main()
{
init();pt();
int cnt1=0;int cnt2=0;
while(1)
{
if(wflag==0) {play1();cnt1++;pt();}
if(wflag==0) {play2();cnt2++;pt();}
if(wflag==1) break;
}
if (cnt1>cnt2)
{
printf("* win!\n");
}
else
{
printf("o win!\n");
}
return 0;
}
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
char c[13]={'0','A','2','3','4','5','6','7','8','9','J','Q','K'};//13张牌,0代表10
char huase[4]={'@','#','$','&'};
int b[4][13]={0};//此数组表示此牌是否发出
int num;//输入你要发牌的数量
printf("input num:\n");
scanf("%d",&num);
scanf("%*[^\n]");
scanf("%*c");
int pstyle=0;//牌的花色,分别用@ # $ &表示
int pcnt=0;//牌的大小
while (num>0)
{
srand(time(NULL));//在程序中只用一次即可
pstyle=rand()%4;//pstyle的选择有 0 1 2 3 ,分别代表不同的花色。
pcnt=rand()%13;
if(b[pstyle][pcnt]==0)
{ printf("%c%c\t",huase[pstyle],c[pcnt]);b[pstyle][pcnt]=1;num--;}
}
return 1;
}
#include <stdio.h>
//将一个数转化成二进制。并将它的二进制输出
int main()
{
unsigned int u=0x80000000;
int x;
printf("input x:\n");
scanf("%d",&x);
int i;
for(i=0;i<32;i++)
{
if(x&u) printf("1");
else printf("0");
u=u>>1;
}
printf("\n");
return 1;
}
http://blogold.chinaunix.net/u/20828/showart_438003.html
#include <stdio.h>
#include <stddef.h>//offsetof()所在的头文件
//结构体中的sizeof是将每个成员都取其中的最大的sizeof来分配,当结构体中包含有另外一个结构体时,是将这个结构体打散来看的。可以理解为把它打开来求取其sizeof
struct S1
{
double c;
int i;
};
struct S2
{
int i;
S1 s1;
char c;
};
int main()
{
S1 s1 = { 'a', 0xFFFFFFFF };
printf("sizeof(S1)=%d\n",sizeof(S1));//16 . pack后为12
printf("sizeof(S2)=%d\n",sizeof(S2));//32 . pack后为18
printf("offsetof(S2)=%d\n",offsetof(S2,c));//24,求在S2中c的地址偏移量 . pack后为16
return 0;
}
sizeof有两个原则,一个是就每个变量而言,它的地址是占位符的宽度的倍数。另一个就整体而言,总体的sizeof要是所有变量的最长宽度的倍数(在unix下最长宽度默认为4,若超过4,以4为准,在windows下默认为8.).
sizeof(一个空的结构体)在不同的平台下是不同的,在unix下是0 ,在windows下是1。
有一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令。它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关。#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么
该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,
公式如下:
offsetof( item ) = min( n, sizeof( item ) )
再看示例:
#pragma pack(push) // 将当前pack设置压栈保存
#pragma pack(2) // 必须在结构体定义之前使用
结构体定义
#pragma pack(pop) // 恢复先前的pack设置
注:void pt(int a[],int n) 在此函数中的sizeof(a)=4.因为此时并不知道a这个数组有多少个元素,所以a只是代表指向数组的指针,故为4.但是要在知道元素个数的情况下,比如int a[9],此时sizeof(a)=36.
6.打印空心实心菱形
#include "stdafx.h"
#include <iostream.h>
#define IABS(x) ( (x)>0? (x):(-x))
void pt1(int size) //打印实心菱形
{
for (int i=-size;i<=size;i++ )
{
for (int j=-size;j<=size;j++ )
{
if(IABS(i)+IABS(j)<=size)
cout<<"*";
else
cout<<" ";
}
cout<<endl;
}
}
void pt2(int size)//打印空心菱形
{
for (int i=-size;i<=size;i++ )
{
for (int j=-size;j<=size;j++ )
{
if(IABS(i)+IABS(j)==size)
cout<<"*";
else
cout<<" ";
}
cout<<endl;
}
}
int main()
{
pt1(5);
pt2(5);
return 0;
}