最大公約數和最小公倍數
最大公約數這裏用輾轉相除法
最小公倍數爲兩數之積除於最大公約數
主要公式
比如求 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;
}