最大公约数和最小公倍数
最大公约数这里用辗转相除法
最小公倍数为两数之积除于最大公约数
主要公式
比如求 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天存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;
}
本文深入探讨了一系列经典算法和数学问题,包括最大公约数、最小公倍数的计算,阶乘的递归实现,菱形图案的生成,九九乘法表的打印,以及求解特定数学序列等。通过C语言代码示例,详细讲解了各种算法的实现原理与步骤。

732

被折叠的 条评论
为什么被折叠?



