C base exercise

本文深入探讨了一系列经典算法和数学问题,包括最大公约数、最小公倍数的计算,阶乘的递归实现,菱形图案的生成,九九乘法表的打印,以及求解特定数学序列等。通过C语言代码示例,详细讲解了各种算法的实现原理与步骤。

最大公约数和最小公倍数
最大公约数这里用辗转相除法
最小公倍数为两数之积除于最大公约数

主要公式
比如求 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值