C base exercise

最大公約數和最小公倍數
最大公約數這裏用輾轉相除法
最小公倍數爲兩數之積除於最大公約數

主要公式
比如求 x,y的最大公約數和最小公倍數
記住這個公式: x * y=最小公倍數 * 最大公約數
最小公倍數 = x * y / 最大公約數
算法導圖
在這裏插入圖片描述

#include<stdio.h>
int  main()
{
    /**********************************/
    /*********求最大公約數*************/
    /********************************/
    int num_1, num_2;
    int temp, sum, ret_val;
    int mix_val;

    printf("please input two number:\n");
    scanf("%d %d",&num_1,&num_2);

    sum = num_1 * num_2;//求積,最小公倍數用

    //計算最大公約數
    if(num_1 < num_2)
    {
         temp = num_1;
         num_1 = num_2;
         num_2 = temp;
    }
    while((ret_val = num_1 % num_2) != 0)
    {
        num_1 = num_2;
        num_2 = ret_val;
    }
    printf("max_val is : %d\n",num_2);

    //計算最小公倍數
    mix_val = sum / num_2;
    printf("mix_val is : %d\n",mix_val);
    
    return  0;
}

求階乘

#include<stdio.h>
int main(void)
{
    int input_number;
    int total  = 1;

    scanf("%d",&input_number);
    while(input_number > 1)
    {
        total *= input_number;
        input_number--;   
    }
    /* 第二種寫法
     for(i = 1; i <= input_number; i++)
    {
        total *= i;
    }
	*/

    printf("total: %d\n",total);
    return 0;
}

使用遞歸函數輸出階乘(-- 和 * 的優先級問題)

/*編寫一個程序使用遞歸函數求一個數的階乘。*/
#include<stdio.h>
int total_factorial(int num)
{
   
    if(num == 1)
        return 1;
    else
        return  num * total_factorial(num - 1);   // 5 * 函數使用 4 * 函數使用 3 * .......直到1 
                                                  //優先級問題 --num的優先級比較高,先做減1 再賦給前面的num
                                                  //num - 1 的話 * 的優先級比較高,先做乘法,num的值先用,後在減1
}

int main(int argc, char *argv[])
{
    int factorial;
    int total = 0;

    printf("please input a factorial number:\n");
    scanf("%d",&factorial);

    total = total_factorial(factorial);
    printf("factorial  total is %d",total);

    return 0;
}

輸入要打印菱形的行數,得出菱形

#include<stdio.h>
int main(void)
{ 

    int line, space, star;
    int i;

    printf("please input line: \n");
    scanf("%d",&line);
    if(0 == line % 2 )//偶數沒有菱形,對其進行+1
        line+1;
    for(i = 1; i <= (line / 2)+1;i++)
    {
        for(space = 1; space <=(line / 2)+1-i; space++ )
            printf(" ");
        for(star = 1; star <= 2*i - 1; star++)
            printf("*");
        putchar('\n');
    } 
    for(i = 1; i <= line / 2; i++)
    {
        for(space = 1; space <= i; space++)
            printf(" ");
        for(star = 1; star <= 9-2*i; star++)
            printf("*");
        putchar('\n');
    }
    return 0;
}

打印九九乘法表
正常矩形九九乘法

#include<stdio.h>
int main()
{
    int i,j,k;

    for(i = 1; i <= 9; i++)
    {
        for(j = 1; j <= 9; j++)
        {
            k = i * j;
            printf(" %d * %d = %d\t",i,j,k);
        }  
        putchar('\n');
    }
    return 0;
}

下右三角九九乘法表

#include<stdio.h>
int main()
{
    int i,j,k;

    for(i = 1; i <= 9; i++)
    {
        for(j = 1; j <= i; j++)//主要是j <= i
        {
            k = i * j;
            printf(" %d * %d = %d",i,j,k);
        }  
        putchar('\n');
    }
    return 0;
}

一個球從100米高度自由落下,每次落地後反彈回原高度的一 半;再落下,求在第幾次之後反彈高度小於0.1米

#include<stdio.h>
int main()
{
    float  higt = 100.0;
  
    int flag=0;
    while(higt > 0.1)
    {
        higt =  higt / 2;
        printf("%f\n",higt);
        flag++;
    }
    printf("%.3f, %d\n",higt,flag);

    return 0;
}

對比兩個數的大小

max =(x>y) ? x : y; 

找出數組中最大值和最小值

//數組比大小,找數組中最大的值
   int arr[80];
   int max,i=0,min;
   int sum = 0,avg = 0;
   int num = 0;
   
    while(1)
    {
        scanf("%d",&arr[i]);
        if(arr[i] == 0)
            break;
        sum += arr[i];
        i++;
        num++;
    }
    max = arr[0];
    min = arr[0];
   for(i = 1; i < num; i++)
   {
       if(max < arr[i])
            max = arr[i];
       if(min > arr[i])
            min = arr[i];
   }
   avg = sum / num;

   printf("%d,%d,%d,%d",max,min,sum,avg);
   return 0;
}

譯碼(字符串規律性遞增)

#include<stdio.h>
int main()
{
    char a[10] ="abcdefg";
    int i;

    for(i = 0;a[i] != '\0'; i++)
    {
        printf("%c",a[i]+i);
    }
    return 0;

}
#include<stdio.h>
int main()
{
    char a[10];
    int i;

    gets(a);

    for(i = 0;a[i] != '\0'; i++)
    {
        printf("%c",a[i]+i);
    }
    return 0;

}

有十個學生的單科成績,求成績在60分以下(不包含60),60-80分(不包含60,不含80)及80分以上(包含80)的學生各有多少個?並求出最高分,最低分,平均分。(分數段的判斷,臨界值的判斷

#include<stdio.h>
int main()
{
    int arr[5];
    int i,max,min,sum = 0;
    float avg = 0;
    int count_60=0,count_80=0,count_90=0;

    for(i = 0; i < 5;i++)
    {
        scanf("%d",&arr[i]);
        sum += arr[i];
    }
    max = arr[0];
    min = arr[0];
    for(i = 0;i < 5; i++)
    {
        if(arr[i] < 60)
            count_60++;
        else if(arr[i] >= 60 && arr[i] <= 80)
            count_80++;
        else if(arr[i] >80 )
        count_90++;

        if(max < arr[i+1] )
            max = arr[i+1];
        if(min > arr[i+1])
            min = arr[i+1];
    }
    avg =(float) sum / 5.0;

    printf("count_60 %d,count_80 %d,count_90 %d\n",count_60,count_80,count_90);
    printf("sum %d,avg  %f",sum, avg);
    
    return 0;
}

打印成績大與80的學生成績和學號(簡單的二維數組輸入與輸出)

判斷字符串是否爲迴文

#include<stdio.h>
void main()
{
    char name[5]= "MADAA";
    int flag = 1;

    char *star = name, *end = name + 4;

    for(;star <= end ;star++,end--)
    {
        if(*star != *end)
        {
            flag = 0;
            break;
        }       
    }
    if(flag)
        printf("this str is ret_letter\n");
    else
        printf("this str not ret-letter\n");
}

輸入一串字符串,判斷是否爲迴文(在for中對變量值的改變,要注意重新歸零,注意P的值在遍歷過後,已經移動,在後面使用的時候要記得重新歸零)

#include<stdio.h>
void main()
{
    char str[10];
    int flag = 1,str_len=0,i;
    char *p;
    p = str;
   char *star,*end;

    gets(p);
    for(; *p != '\0'; p++)
    {
        str_len++;
    }
   p = str; //將P指針重新歸str首地址
   star = p; 
   end = p + str_len-1;
   for(;star <= end ; star++,end--)
    {
        if(*star != *end)
        {
            flag = 0;
            break;
        }      
    }
    if(flag)
        printf("this str is ret_letter\n");
    else
        printf("this str not ret-letter\n");
}

用指針將一維數組的所有元素反序

#include<stdio.h>
int  main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    int *p,i;

    p = arr;
    for(;*p != '\0';p++);
   
    for(i = 0; i< 10; i++)
    {
        printf("%d\n",*(p-1-i));
    }
    return 0;
}

輸入一個字符串,將字符串反向後輸出,要求用指針實現

#include<stdio.h>
int  main()
{
    char arr[10];
    int i,str_len=0;
    char *p;
    gets(arr);
    p = arr;
    for(;*p != '\0';p++)
        str_len++;
    p = arr;
    for(i = 0; i< str_len; i++)
    {
        printf("%c",*(p+str_len-1-i));
    }
    return 0;
}

求任意10個數中元素值爲奇數的數字之和
(整形數組沒有結束標誌)

#include<stdio.h>
int main()
{
    int arr[10];//整形數組中沒有結束標誌符
    int *p,count=0,i;
    int sum = 0;

    for(i = 0; i < 10;i++)
    {
        scanf("%d",&arr[i]);
    }
    p = arr;
    for(i = 0;i < 10; i++)
    {                
        if((*p % 2) != 0){
            printf("%d\t",*p);
            sum += *p;
        }
        p++;  
    }
    printf(" %d",sum);
    return 0;
}

輸入一個正整數求出它是幾位數;輸出原數和位數。

#include<stdio.h>
int main()
{
    char num[20];
    int i, count = 0;

    gets(num);
    for(i = 0; num[i] != '\0';i++)
    {
       // printf("%d\n",num[i]);
        if(num[i] >= '0' && num[i] <= '9')
        {
            count++;
        }
    }
    printf("%d\n",count);
    puts(num);
    return 0;
}

輸入一個正整數,輸出原數並逆序打印出各位數字。
(注意:找數的各個位數可以不斷的除以10,找出它的最後一位)

#include<stdio.h>
int main()
{
    int  num;

    scanf("%d",&num);
    printf("%d\n",num);
    while (num > 0)
    {   
        if(num >= 0 && num <= 9)
        {
           printf("%d",num);
            break;
        }
        else
        {
           
            printf("%d",num % 10);
            num = num / 10;
            continue;
        }
    }
    return 0;
}

求下列試子的值:1-1/2+1/3-1/4+……+1/99-1/100 的值

#include<stdio.h>
void main()
{
    int i, j;
    float sum = 1.0,s = 1,t;

    for(i = 1; i < 100; i++)
    {       
        t = s /i;
        sum = sum + t;
        s = s*(-1);
        //printf("%d\n",i);
    }
    printf("%f",sum);
}

打印出100~999之間的所有水仙花數

#include<stdio.h>
int main()
{
    int bit, ten, hundred;
    int temp, num;

    for(num = 100; num <= 999; num++)
    {
    	/* 取輸入數的個位,十位,百位*/ 
        bit = num / 100;       
        ten = (num / 10) % 10;
        hundred = num % 10;

		/*對個位、十位、百位分別做3次方後相加操作*/
        temp = bit*bit*bit + ten*ten*ten + hundred*hundred*hundred;
        if( temp == num)
        {
            printf("%d \n",num);
        }
    }
    return 0;
}
#include<stdio.h>
int main()
{
    int i, j,k;
    for(i = 1; i < 6; i++)
    {
        for(j = 0;j < 5 - i; j++)
        {
            printf(" ");           
        }

        for(j = 1; j <= (2*i-1)/2; j++ )
        {
            printf("%d",j);
        }
        for(k = 0; k <= i-1; k++ )
        {
            printf("%d",j--);
        }
        printf("\n");
    }
    return 0;
}

14.打印以下圖案:
在這裏插入圖片描述

#include<stdio.h>
int main()
{
    int i, j,k,num;

   // printf("please input a number: \n");
   // scanf("%d",&num);
    
    for(i = 1; i < 6; i++)                //打印上半部分
    {
        for(j = 0;j < 5 - i; j++)         //打印空格
        {
            printf(" ");           
        } 
        for(j = 1; j <= (2*i-1)/2; j++ )  //打印左半邊的數值
        {
            printf("%d",j);
        }
        for(k = 0; k <= i-1; k++ )        //打印右半邊的數值
        {
            printf("%d",j--);             //j的值在上面的for循環中已經遞增
        } 
        printf("\n");
    }

    for(i = 0; i < 4; i++)                //打印下半部
    {
        for(j = 0;j < i + 1; j++)
        {
            printf(" ");
        }
        for(j = 1; j < 4-i; j++)
        {
            printf("%d",j);
        }
        for(k = 0;k < 4-i; k++)
        {
            printf("%d",j--);
        }
        printf("\n");
    }
    return 0;
}

在以上基礎上加上用戶輸入功能

#include<stdio.h>
int main()
{
    int i, j, k, num;

    printf("please input a number: \n");
    scanf("%d",&num);
    
	//如果輸入的數爲偶數就加一
    if(num % 2 == 0 )
    {
        num += 1;
    }
    
    for(i = 1; i < num / 2 + 2; i++)                //打印上半部分
    {
        for(j = 0;j < num /2 +1 - i; j++)         //打印空格
        {
            printf(" ");           
        } 
        for(j = 1; j <= (2*i-1)/2; j++ )  //打印左半邊的數值
        {
            printf("%d",j);
        }
        for(k = 0; k <= i-1; k++ )        //打印右半邊的數值
        {
            printf("%d",j--);             //j的值在上面的for循環中已經遞增
        } 
        printf("\n");
    }

    for(i = 0; i < num/2; i++)                //打印下半部
    {
        for(j = 0;j < i + 1; j++)
        {
            printf(" ");
        }
        for(j = 1; j < num/2 - i; j++)
        {
            printf("%d",j);
        }
        for(k = 0;k < num /2 - i; k++)
        {
            printf("%d",j--);
        }
        printf("\n");
    }
    return 0;
}

生成10個100以內的隨機數值

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    int num,count=0;

    /*
      **rand函數要使用到stdlib頭文件,在rand使用過程中,如果不使用srand函數,則每次生產的
      隨機數都固定,使用srand函數要time頭文件配合,時間函數time(NULL)作爲seed,數值每秒
      都在變化**
    */

    srand(time(NULL));
    while(1)
    {
       
        num  = (rand() % 100);
        
        if(num > 10 && num < 35)
        {
            count++;
             printf("%d\t",num);
        }
        if(count == 10)
        break;
    }
    return 0;
}

一、 有人用溫度計測量出用華氏法表示的溫度f(如69°F),今要求把它轉換爲以攝氏法表示的溫度c(如20°C),轉換公式爲: 。(溫度保留小數點後6位)
(在計算浮點型和整形時,浮點型的優先級比較高,若兩個數都爲整形,則將其中一個數變爲浮點型,比如 5 變爲 5.0)

#include<stdio.h>

float wendu_shift(float  num)
{
    float sheshidu;
    sheshidu = (5.0 / 9) * (num - 32.0);
    printf("%f\n",sheshidu);

    return sheshidu;
}

int main(int argc, char *argv[])
{
    float num;
    
    printf("please input a number: \n");
    scanf("%f",&num);

    num = wendu_shift(num);

    printf("%.6f'C ",num);
    
    return  0;
}

在0-100之間,打印"smalle"
在101-200之間,打印"middle"
在201-300之間,打印"large"
在大於300,打印"error"

#include<stdio.h>
int main(int argc, char *argv[])
{
    int num;

    printf("please input a number: \n");
    scanf("%d",&num);

    if(num >= 0 && num <= 300)
    {
        if(num >=  0 && num <= 200)
        {
            if(num >=  0 && num <= 100)
            {
                printf("smalle\n");
                return 0;
            }
            printf("middle\n");
            return 0;
        }
         printf("large\n");
        return 0;
    }
    else
    {
        printf("error\n");
    }
     return 0;
 }

編寫一個程序驗證某數是否是素數

/****判斷一個數是否爲素數****/
#include<stdio.h>

void is_prime(int num)
{
   
    if(num % 2 != 0)
    {
        printf("the num is prime\n");
    }
    else
    {
        printf("the num is not prime\n");
    }
    
}

int main(int argc, char argv[])
{  
    int num;

    printf("please input a number\n");
    scanf("%d",&num);

    is_prime(num);

    return 0;
}

有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?

#include<stdio.h>
int main(int argc, char *argv)
{
    int arr[4] = {1,2,3,4};
    int i, j, k;

    for(i = 1 ; i <= 4; i++)
        for(j = 1; j <= 4; j++)
            for(k = 1; k <= 4;k++)
            {
                if(i != k && i != j  && k != j)
                printf("%d  %d  %d\n",i,j,k);            
            }

    return 0;
}

一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?

#include<stdio.h>
#include<math.h>
int main(int argc, char *argv[])
{
    long int i = 1, x, y;

    while(i > 0)
    {
       x = sqrt(i + 100);
       y = sqrt(i + 268);
       if(x * x == i + 100 && y * y == i + 268)
       {
           printf("%ld\n",i);
       }
        i++;
    }
    return 0;
}

輸入任意N個數據,從大小排序(冒泡排序法)排完序可以找到第二大的數

/***輸入任意數組,從大到小排序,可以得到第二大的數***/

#include<stdio.h>

int main(int argc, char *argv[])
{
    int arr[100];
    int i = 0, k, temp;
    int arr_i, arr_j;

    printf("please input any number:\n");

    do{
       scanf("%d",&arr[i]);
       i++;
    }while(k = getchar() != '\n');

    for(arr_i = 0; arr_i < i - 1; arr_i++)
    {
        for(arr_j = 0; arr_j < i - 1 - arr_i; arr_j++)//每次排序到最後一個,每一輪最後一個不變
        {
            if(arr[arr_j]  < arr[arr_j + 1])          //從小到大 用 > 從大到小  <
            {
                temp = arr[arr_j];
                arr[arr_j]  = arr[arr_j + 1];
                arr[arr_j + 1] = temp;
             }
        }
    }

    for(arr_i = 0; arr_i < i; arr_i)
    {
        printf("%d ",arr[arr_i]);
		arr_i++;
    }

	//找第二大數,因爲排完序了,可以找到第二大數
	printf("%d",arr[1]);

    return 0;
}
  1. 第1天存100塊,每一天都比昨天多存10塊,求出第99天一共存了多少?使用遞歸函數來完成。
#include<stdio.h>

int recursive(int a)
{
    int money = 0;

    /*錯誤判斷*/
    if(a <= 0)
    {
        return -1;
    }
    /*終止條件*/
    else if(a == 1)
    {
        return 100;
    }
    /*最終目標與終止條件之間的關係*/
    else
    {
        printf("%d\n",a);
        money = (recursive(a-1)+(a-1)*10+100); ;
    }  

    return money;
}

int main(int argc, char argv[])
{
    int x, ret;

    ret = recursive(99);

    printf("%d",ret);


    return 0;
}

回調函數的基本使用

#include<stdio.h>

int max(int x, int y, int i, int j, int (*p) (int ,int ))  //調用回調函數
{
    int ret1, ret2, ret;

    ret1 = p(x, y);
    ret2 = p(i, j);
    ret = p(ret1, ret2);

    return ret;
}

int callback(int x, int y)    //回調函數
{
    if(x < y)
         return y;
    else
        return x;
}

int main(int argc, char *argv[])
{
    int a, b, c, d;
    int ret;

    scanf("%d %d %d %d",&a, &b, &c, &d);

    ret = max(a,b,c,d,callback);//調用回調函數

    printf("%d",ret);
}

遞歸實現斐波那契數

/*---------------------------------------

遞歸實現斐波那契數  1 1 2 3 5 8 13 21

-----------------------------------------*/

#include<stdio.h>

int Fib1(int n)
{
    int ret ;
    if(n == 1 || n == 2)
    {
        return 1;
    }
    else
    {
        ret =  Fib1(n -1) +Fib1( n - 2);
    }

    return ret;
}

int ret_Fib2(int n)
{
   int i, ret, sum = 0;

   printf("fib is ");
   for(i = 1; i <= n; i++)
   {
      ret  = Fib1(i); //Fid得到的是當前輸入i的斐波那契數,把輸入數前面一個個的數給他,並賦給ret
      sum = sum + ret;
      printf(" %d\t",ret);
   }
   putchar('\n');

   return sum;
}

int main(int argc, char *argv[])
{
    int num;

    printf("please input a fib number: \n");
    scanf("%d",&num);

    printf("fib total is %d\n",ret_Fib2(num));
    printf("%d\n",Fib1(num));
       
    return 0; 
}

快速排序實現:在這裏插入圖片描述

#include<stdio.h>

void quicksort(int *s, int start, int end)
{
    int i = start;
    int j = end;
    int key = s[start];

    while(i < j)
    {
        while(i < j && key < s[j] )//如果沒有找到比key大的值
        {
            j--;//最高位就左移
        }
        if(i < j)//如果找到了,就開始將找到的數和標誌位交換位置
        {
            s[i] = s[j];
            i++;   
        }
        while(i < j && s[i] <= key)  //從低端位找,找比key大的值
        {
            i++;
        }
        if(i < j)//如果找到i和j的值就交換位置
        {
            s[j] =s[i];
            j--; 
        }
    }//找完一輪,左邊小與key,右邊大於key
    s[i] = key;//將基準元素放到指定位置,大概位置在中間
    if(start < i)//左半邊開始
    {
        quicksort(s,start, j -1);//j-1已經在中間
    }
    if(i < end)//右半邊
    {
        quicksort(s, j+1,end);
    }

}
int main()
{
    int a[6],i;
    printf("pls input ten number:\n");
    for(i = 0; i < 5; i++)
    {
        scanf("%d",&a[i]);
    }

    //打印沒排序前的數
    printf("sort befor :");
    for(i = 0; i < 5; i++)
    {
        printf("%d\n",a[i]);
    }
    quicksort(a,1,5);
    //打印快排後的數
    printf("sort befor :");
    for(i = 0; i < 5; i++)
    {
        printf("%d\t",a[i]);
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章