程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c 指針 及其位運算循環移動拔河比賽問題代碼,指針拔河比賽

c 指針 及其位運算循環移動拔河比賽問題代碼,指針拔河比賽

編輯:關於C語言

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語言位運算的一些小錯誤,大俠指點下

p=a~b;

取反是單目運算符,只能有一個變量,你這裡面寫了2個變量是不正確的
你可以寫成p=~a;p=~b;p=~(a&b);都可以,但是不能寫成p=a~b;因為他是單目運算符
而與,或,異或都是雙目運算符,他需要2個變量,所以前面的沒問題

運算所需變量為一個的運算符叫單目運算符
邏輯非運算符【!】、按位取反運算符【~】、自增自減運算符【++ --】、負號運算符【-】、類型轉換運算符【(類型)】、指針運算符和取地址運算符【*和&】、長度運算符【sizeof】
 

C語言編寫程序,進行位運算

位運算

在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能, 這使得C語言也能像匯編語言一樣用來編寫系統程序。

一、位運算符C語言提供了六種位運算符:

& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移

1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。

例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。

按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}

2. 按位或運算 按位或運算符“|”是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下: 00001001|00000101
00001101 (十進制為13)可見9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}

3. 按位異或運算 按位異或運算符“^”是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進制為12)
main(){
int a=9;
a=a^15;
printf("a=%d\n",a);
}

4. 求反運算 求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結果為:1111111111110110

5. 左移運算 左移運算符“<<”是雙目運算符。其功能把“<< ”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數指定移動的位數,
高位丟棄,低位補0。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。6. 右移運算 右移運算符“>>”是雙目運算符。其功能是把“>> ”左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位數。
例如:設 a=15,a>>2 表示把000001111右移為00000011(十進制3)。 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。Turbo C和很多系統規定為補1。
main(){
unsigned a,b;
printf("input a number: ");
scanf......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved