c 指针 及其位运算循环移动拔河比赛问题代码

week_2_day1_7.7 周一
//用字符数组 来实现 字母大小写转换
#include<stdio.h>
void desc( char *a ,int n)
{
    char  *i = a;
    int x = 0 ;
    for ( x = 0; x < n ;x ++ )
    {
                    if ( *i  >= 97 )
                        *i-=32;
        i++;
    }
}
int main(void)
{
    void desc(char  *num, int n);//必须在函数内部声明
   char num[100], a;
    int i = 0, k = 0;
    while((a = getchar ())!= ‘\n‘){
        num[i] = a;
        i++;
    }
    desc(num,i);
    for (k = 0; k < i;  k ++) {
        printf("%c",num[k]);
    }
    return 0;
}
//大数字加法
#include <stdio.h>
int main(int argc, const char * argv[])
{

int a[1001] = {},b[1001] = {} , c[1001] = {} ;
     int i , j= 0  , k1 = 0 ,k2 = 0 ,count1 = 0 , count2 = 0;
    char ch  , ch1 = ‘0‘;
    for (i = 1; (ch = getchar()) != ‘ ‘ ; i ++) {
        j = ch - ch1;
        a[i] = j;
    }//第一个大数字
     k1 =i - 1;
    for (i = 1; (ch = getchar()) != ‘\n‘ ; i ++) {
        j = ch - ch1;
        b[i] = j;
    }//第二个大数字
    k2 = i - 1 ;
    if (k1 > k2) {
        count1 = k1;
        count2 = k2;
    }
    else{ count1  = k2;
        count2 = k1;
    }
    for ( i = count1 ; i > 0 ; i --,k1 --, k2 -- ) {//加法
        if (k2 <= 0)
            c[i] += a[k1];//判断是否 那个比较小的数字 是否已经加完
        else if ( k1 <= 0)
            c[i] += a[k2];
        else{
            c[i] += (a[k1] + b[k2]);
            if (c[i] > 9)
            {
                c[i] %= 10;
                c[i-1] = 1;//是否进位
            }
        }
    }
    if (c[0] == 1)
        printf("%d",c[0]);
    for ( i = 1 ; i <= count1 ; i ++ )
        printf("%d",c[i]);
    printf("\n");
    return 0;
}
//n!的位数  暂时不是太懂

#include <stdio.h>
#include <math.h>
int factorial(int n)
    {
        long a[10000];
        int i,j,c,m=0,w,l = 0;
        
        a[0]=1;
        for(i=1;i<=n;i++)
        {
            c=0;
            for(j=0;j<=m;j++)
            {  
                a[j]=a[j]*i+c;
                c=a[j]/10000;
                a[j]=a[j]%10000;
            }
            if(c>0) {m++;a[m]=c;}
        }
        w=m*4+log10(a[m])+1;
       // printf("\n%ld",a[m]);
       // for(i=m-1;i>=0;i--)
       //     printf("%4.4ld\n",a[i]);
        return w;
    }

int main(int argc, const char * argv[])
{
    
    int x;
    scanf("%d",&x);
    x=factorial(x);
    printf("%d",x);
    return 0;
}
//拔河比赛分配方案
//就是用随机函数确定那个人 在那一队,然后比较那一队和总体重相差小,就输出他。
#include<stdio.h>
#include <stdlib.h>
#include <sys/_types/_mode_t.h>
int swap(int *a, int j);
int  swap(int *a , int j)
{
    int min  = 0, b ,s = 0 , sum = 0;
    int c[100] = {};
    for ( int i = 0; i < j ; i ++ ) {
        sum += a[i];
    }//总人数的 体重
    printf("总体重:%d\n",sum);
    for ( int h = 0; h < j;  h ++)
    {
        c[h] = -1;
    }
    for ( int i = 0;  i < 10000;  i ++)
    {
            for ( int n = 0;  n < j/2;  n ++)
            {
              AA:
                b = abs(arc4random()%(j));
                for ( int h = 0; h < n;  h ++)
                {
                    if (c[h] == b)
                    {
                        goto AA;
                    }
                }
                c[n] = b;
                s += a[b];
            }
        
            for ( int h = 0; h < j;  h ++)
            {
                c[h] = -1;
            }//重置 保存的 已经有用的数据
        
            if (abs(sum/2 - min) > abs(sum/2 - s) ) {
                min = s ;
            }
            s = 0;
    }
    return  min;
}
int main(void)
{
    int  a ,ch[100],sum = 0 ;
    printf("请输入拔河比赛的总人数:");
    scanf("%d",&a);
    for ( int i =0;  i < a;  i ++)
    {
        printf("请输入第%d个人:",i+1);
        scanf("%d",&ch[i]);
        
    }
    int min = swap(ch, a);
    for ( int i = 0; i < a ; i ++ ) {
        sum += ch[i];
    }
    printf("比较轻的队伍:%d\n",min);
    printf("比较重的队伍:%d\n",sum-min);
     //printf("%d\n",a, j);
    return  0 ;
}
//将n向右循环a位  然后输出
#include <stdio.h>
int ch[32] = {} , ch_l[32] = {};
void printfArry( int *a , int b);//输出数组
int * del_num( long a);//分解数字为2进制 存进数组
int * Toright( int * p, int m);//向右移动
int To_arry_num( int k);//每个数组应该加的2的k次幂
int  To_sum( int *p ,int h);//最后输出的 转换后的 数字
void printfArry( int *a , int b){
    int i = 0 ;
    for ( i = 0 ;  i < b;  i ++) {
        printf("%d\t",a[i]);
    }
}
int * del_num( long a){
    int i = 0;
    for ( i = 0;  a > 0; i ++ )
    {
        if ( a %2 == 0) {
            ch[ 31 - i] = 0;
        }
        else{
            ch[ 31 - i] = 1;
        }
        a /= 2 ;
    }
    return ch ;
}
int * Toright( int * p, int m)
{
    int i = 0 , k = 31 , j ;
    for ( i =  31- m;  i >=0;   k-- ,i --)
    {
        ch_l[k] = p[i];
    }
    for ( j = 31 ; j >31 - m ; k -- ,j --) {
        ch_l[k] = p[j];
    }
    
    return  ch_l;
};

int To_arry_num(int k){
    int i = 0 , s=1;
    for ( ;  i < k ;  i ++) {
        s *= 2 ;
    }
    return  s;
}
int  To_sum( int *p , int h){
    int sum = 0 , i = 0;
    for ( i = 0; i < h;  i ++ )
    {
        if ( p[i] == 1)
        {
            sum += To_arry_num( 31-i);
        }
    }
    return sum;
}
int main(int argc, const char * argv[])
{

long a ;
    int  *p , m = 0;
    scanf("%ld",&a);
    scanf("%d",&m);
  //  printf("%ld\n",a);
    if ( a  == -1) {
        printf("-1");
    }
    else
    {
    p =del_num(a);//分解数字为2进制
    p=Toright(p, m);
    
    printfArry(p,32);
    printf("\n");
    a = To_sum(p, 32);
    printf("%ld\n",a);
    }
        return 0;
}
//循环左边移动 n位
#include <stdio.h>
int ch[32] = {} , ch_l[32] = {};
void printfArry( int *a , int b);
int * del_num( long a);
int * Toleft( int * p, int m);
int To_arry_num( int k);
int To_sum( int *p ,int h);
void printfArry( int *a , int b){
int i = 0 ;
for ( i = 0 ; i < b; i ++) {
printf("%d",a[i]);
}
}
int * del_num( long a){
int i = 0;
for ( i = 0; a > 0; i ++ )
{
if ( a %2 == 0) {
ch[ 31 - i] = 0;
}
else{
ch[ 31 - i] = 1;
}
a /= 2 ;
}
return ch ;
}
int * Toleft( int * p, int m)
{
int i = 0 , k = 31 - m ;
for ( i = 31 ; k == 0 ; k-- ,i --)
{
ch_l[k] = p[i];
}
for ( k = 31 -m ; i >= 0; k -- ,i --) {
ch_l[k] = p[i];
}

return ch_l;
};

int To_arry_num(int k){
int i = 0 , s=1;
for ( ; i < k ; i ++) {
s *= 2 ;
}
return s;
}
int To_sum( int *p , int h){
int sum = 0 , i = 0;
for ( i = 0; i < h; i ++ )
{
if ( p[i] == 1)
{
sum += To_arry_num( 31-i);
}
}
return sum;
}
int main(int argc, const char * argv[])
{

long a ;
int *p , m = 0;
scanf("%ld",&a);
scanf("%d",&m);
// printf("%ld\n",a);
if ( a == -1) {
printf("-1");
}
else
{
if ( m != 32)
{
p =del_num(a);//分解数字为2进制
p=Toleft(p, m);

// printfArry(p,32);
printf("\n");
a = To_sum(p, 32);
printf("%ld\n",a);
}else
{
printf("%d",a);
}
}
return 0;
}

//实现一个按照ID进行排序的链表,并按有序的方式初始化链表中的结点,然后实现向链表中插入一个新结点,在插入完成后,不会破坏链表的排序。

#include <stdio.h>
//#include<malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct stu)
struct stu {
        int id;
    char a[1];
    struct stu *next;
    };
    int n;
struct stu* c(void){//创建链表
        struct stu *head ;
        struct stu *p1,*p2;
        n = 0;

p1 =p2 =(struct stu*)malloc(LEN);
    scanf("%d%c",&p1->id,&p1->a[0]);
    head =  NULL ;
     do{
                 n += 1;
           if ( n == 1) head = p1;
        else    p2->next = p1;
            p2 = p1;
         
         if(p2->a[0] == ‘\n‘ )
             break;
            p1 = (struct stu *)malloc(LEN);
            scanf("%d%c",&p1->id,&p1->a[0]);
            p2 -> next  = NULL;
    }while (1);
     
        return  (head);
}
int main(int argc, const char * argv[])
{
    struct stu *p ,*p3, *p4,*p5;
     p = c();
    p5 = p;
    p3=(struct stu *)malloc(LEN);
    scanf("%d",&p3->id);
    p4=p->next;
    while (1) {
        
    
    if (  (p4 ->id) < (p->id) ) {
        if ( p3->id >p4->id && p3->id < p->id)
        {
            p3->next = p4;
            p->next = p3;//插入一个指针
            break;
        }
        else
        {
             p = p4;
            p4 = p4->next;//向后边移动一个地址
        }
    }
    if ( p4 ->id > p->id)
    {
        if (p3->id > p->id && p3->id < p4->id)
        {
            p3->next = p4;
            p->next = p3;//向后边移动一个地址
            break;
        }
        else
        {
            p = p4;//向后边移动一个地址
            p4 = p4->next;
        }

}
    }
    while (p5 != NULL) {
        printf("%d",p5->id);
        p5 = p5->next;
    }

printf("\n");
    return 0;
}

c 指针 及其位运算循环移动拔河比赛问题代码

时间: 2024-08-15 13:29:15

c 指针 及其位运算循环移动拔河比赛问题代码的相关文章

nyist oj 138 找球号(二)(hash 表+位运算)

找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,还有一个空箱子,现在有两种动作:一种是"ADD",表示向空箱子里放m(0<m<=100)个球,另一种是"QUERY",表示说出M(0<M<=100)个随机整数ki(0<=ki<=100000100),分

C程序设计之位运算

指针和位运算很适合编写系统软件的需要. 位运算指进行二进制位的运算. 按位与”运算符 & 用途 1)清零 2)取一个数中某些指定位(比如只需要低8位) 3)想保留哪一位保留下来,就与一个数进行&运算,此数在该位取1. 按位或 | 按位异或(XOR) ^  同0异1 1)使特定位翻转 2)与0相异或,保留原值 3)交换两个值,不用临时变量 //假如a=3,b=4.将a和b交换值 a=a^b; b=b^a; a=a^b; b=b^(a^b)=a^b^b=a;( b^b=0) a=a^b^(b^

编程思想:巧用位运算重构代码

开篇 在一门编程语言中,往往会提供大量的运算符.按功能来分的话,有算术运算符.赋值运算符.关系运算符.逻辑运算符.位运算符等.这些对于大家来说都不陌生.但是,本期的主角『位运算』符相对而言是比较少去使用的.因为位运算符主要针对两个二进制数进行位运算. 巧用位运算能极大的精简代码和提高程序效率.所以,在一些优秀的开源代码中,经常能出现位运算.所以,把位运算这种思想迁移到业务代码里,有时候往往能起到柳暗花明般的重构. 位运算 在 JAVA 语言中,定义了诸多的位运算符,如下所示: 运算符 描述 &

2015.8.5 循环与函数、位运算

注意点: 1.只有整形才可以用switch. 2.case后面的常量不可以重复 3.default语句可以放在任意位置,但是后面不可以省略break: while: 1.用来处理一些重复执行的操作 2.确定循环终止的条件 (1)在循环开始之前,需要定义一个循环控制变量并将其初始 (2)确定循环的约束条件 (3)在每一次循环结束的时候,在循环中,要去改变循环控制变量的值,让它不间断接近约束条件 注意点: 1.在c语言总任何树枝都有真假性,只有0为 假,其它都为真 2.注意不把==和=混淆了,为了避

JavaSE学习(三):按位运算—数据结构(顺序、分支、循环)

  第一节 按位运算 1.1按位运算符&  | 1.1.1按位运算符可作算术运算 做算术运算先将十进制转为二进制数,再按位计算,按位与全部为1,才为1,只要有0则为0:按位或只要有1则为1,全部为0才为0.最后按位输出再转为十进制. 7&3 = 3  -----  0111 & 0011 == 0011  3 7|3 = 7  -----  0111 & 0011 == 0011  7 1.1.2按位运算符可作逻辑运算 按位与&和按位或| 做逻辑功能时,与逻辑与&a

C-函数,数组指针,指针之间的运算

goto原理: 当执行到goto语句的时候, cpu就会跳转到当前函数指定的标志的地方 使用goto也可以实现循环操作 但是在使用的时候,要注意不要造成死循环 一般情况下不建议经常使用goto语句,因为不安全——容易造成死循环 除非在特别确定不会有死循环的情况下,才可以用goto goto不仅可以往前跳,还可以往后跳 使用goto时, 标签代码行的下一行代码不能是声明变量,如果非要写在这个地方,那就在声明变量行前面加一句无意义的代码 标示符:  通俗来讲就是程序员可以自己命名的东西: 变量名,g

位运算基本概念及简单运用

C语言提供了六种位运算符: &     按位与    |      按位或    ^      按位异或    ~      取反    <<    左移,相当与*2    >>    右移,正数高位补0,负数由计算机决定 循环左移k次 (x<<k) | (x >> (32-k)), 循环右移k次 (x>>k) | (x << (32-k)) 当然常常应为优先级问题而犯错~~~ 优先级及口诀如下 优先级别 运算符 记忆口诀 1

[翻译]位运算暗黑魔导书

原文地址:http://graphics.stanford.edu/~seander/bithacks.html 有本书叫hack's delight也是主讲位运算的. 下面正文开始翻译吧,不定时更新. 声明: 如无特殊说明,所有的代码段都是不受版权限制的,如果喜欢,大家可以随便使用.文章内容由Sean Eron Anderson收集整理于1997-2005年.位运算的相关代码.说明以及分类希望能够给大家带来帮助,但是不对于该内容是否适合特定用途提供任何担保(or授权?).截止2005年5月5日

结构体、共用体和位运算

1.C语言结构体的定义和使用 在实际问题中,一组数据往往具有不同的数据类型:例如在学生信息登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实型.因为数据类型不同,显然不能用一个数组来存放. 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.定义结构体的一般形式为: struct 结构体名{ 成员列表 }; 每个成员都是结构体的组成部分,有名字,也有数据类型,形式为: 类型说明符 成员名; 例如用结构体来表示学生信息: struct stu{ c