C语言经典程序
1、輸入一行字符統計單詞個數
1、字符串以'\0'作為結束標志
2、for循環內的 第一部分的i++ 類似開關,使得下標能指向下一位元素進行判斷
2、輸出不重復三位數
- 有0、1、2、3、4共5個數字 能組成多少個互不相同且無重復數字的3位數?并輸出這些數
#include<stdio.h> int main() {int i, j, k, count = 0;for (i = 1; i < 5; i++) {for (j = 0; j < 5; j++) {for (k = 0; k < 5; k++) {if (i != j && i != k && j != k) {printf("%d ", i * 100 + j * 10 + k);count++;}if (count % 5 == 0) {printf("\n");}}}}printf("\n3位數總個數=%d\n", count); }1、枚舉列出所有情況,再從其中進行篩選
2、無重復數字 =( i != j && i != k && j != k)
3、注意百位不包括數字0
3、水仙花數
3.1 方法一:枚舉法
#include<stdio.h> #include<math.h>//使用三次方函數pow int main() {int i, j, k,count=0,number;for (i = 1; i < 9; i++) {for (j = 0; j < 9; j++) {for (k = 0; k < 9; k++) {number = i * 100 + j * 10 + k;//153 = 1的三次方 +5的三次方 +3的三次方if ( number==(pow(i,3) + pow(j,3) + pow(k,3)) ){printf("%d ",number);count++;}}}}printf("\n水仙花數個數=%d\n",count); }3.2 方法二:取出各個位數
#include<stdio.h> #include<math.h>//使用三次方函數pow int main() {int ge, shi, bai,count=0;for (int i = 100; i < 1000; i++) {ge = i % 10;shi = i / 10 % 10;;bai = i / 100;if (i == pow(bai, 3) + pow(shi, 3) + pow(ge, 3)) {printf(" %d", i);count++;}}printf("\n水仙花數個數: %d", count); }1、方法二的使用更加廣泛,在應對求更大范圍的水仙花數時更加實用
4、完數
方法一:枚舉法
#include<stdio.h> //找出一萬以內的完數 完數:6=1+2+3, 28=1+2+4+7+14 本身等于其因子之和 int main() {int i, j, sum,count=0;//列出所有數for (i = 1; i < 10000; i++) {sum = 0;//注意每次要先清空上一次的因子之和for (j = 1; j < i; j++) {//選出其中所有的的因子if (i % j == 0) {sum += j;}}//本身等于因子之和if (sum == i) {printf("%d ", sum);count++;}}printf("\n一萬以內完數的個數:%d", count); }方法二:算法
書本P156 有提升性能的算法 以根號i作為一個分水嶺,因子關于其對稱,當出現兩邊因子相同則要減去一個
5、判斷整數重復數字
- 輸入一個不超過9位數的無符號整數,判斷該整數中是否存在重復數字
用一個數組通過每次截取個位數,實現記錄每位數字出現的次數。這種思想要學會
6、插入升序數組,使插入后還是升序
#include<stdio.h> #define N 10 int main() {//多預留了一位空位置用于放插入數據int arr[N] = { 1,2,10,13,20,32,40,67,80 },*p=arr+N-2,in;//使指針指向最后數組最后一位printf("請輸入要插入的數字:");scanf("%d",&in);//進行反向掃描while (p >= arr) {if (*p > in) {//將值移動到右邊*(p + 1) = *p;p--;}else{break;}}//循環結束后指針移動到了比待插入數字要小的數字處 在其右邊插入*(p + 1) = in;printf("插入后的數組:");for (int i = 0; i < 10; i++) {printf("%d ", arr[i]);} }指針倒序掃描找到待插入位置,在其右側插入
7、字符串中提取整數
- 假設輸入的字符串中有數字和非數字字符(如"a123x456 17960? 302tab799“), 編寫程序找出字符串中所有由連續的數字字符組成的整數(如123、456、19960、302、6799),并統計共找到多少個整數
8、兩個升序數組合并成一個
#include<stdio.h>//數組名本身就是首元素的地址,即指向首元素的指針 void merge_sort(int *x, int lenx,int *y, int leny,int* z) {int i=0, j=0, k=0;//只要小于數組長度就繼續比較//比較后較小的數組會消失,留下兩數組的差值部分沒有比較,直接存入while (i < lenx && j < leny) {if (x[i] < y[j]) {z[k++] = x[i++]; //等價于 z[k[ = x [i]; k++; i++;}else{z[k++] = y[j++];}}//如果其中一個數組還有剩余,則按順序依次存入while (lenx > i) {z[k++] = x[i++];}while (leny > j) {z[k++] = y[j++];} }//兩個升序數組合并成一個 int main() {int a[10] = { 0,3,6,9,10,18,23,25,30,35 };int b[8] = { -5,-1,1,2,5,11,28,40 };int i, c[18];printf("原始數組a:");for (i = 0; i < 10; i++) {printf("%d ", a[i]);}printf("\n原始數組b:");for (i = 0; i < 8; i++) {printf("%d ", b[i]);}merge_sort(a,10,b,8,c);printf("\n合并后的新數組c:");for (i = 0; i < 18; i++) {printf("%d ", c[i]);} }運用數組下標和本身就是升序的特性將兩個舊數組進行比較存儲,余下的再按順序存儲
9、字符串匹配
- 設主串數組名為S,子串數組名為T,找出子串T在主串S中第一次出現的位置
運用下標逐個比較,注意不相符的比較需要將 主串的起始位置移動到主串的下一位 子串從頭開始 再次進行逐個比較
10、學生加權平均成績
- 4個學生,每個學生有3門課程的成績,每門課程的學分不一樣。請計算每一個學生的加權成績
11、字符串中找出字符
#include<stdio.h> char* strch(char* s, char ch) {//跳過不匹配的字符while (*s && *s != ch) {s++;}//如果不是讀到了末尾,則返回當前匹配的字符指針if (*s) {return s;}return NULL; }//在一串字符串中找出某一個字符 int main() {char str[81] = "abcdefg", ch = 'h', * p = str,*s;s= strch(p,ch);if (s == NULL) {printf("字符串中不存在該字符!");}printf("從字符串中找出的字符:%c", *s); }運用指針,對字符串中的每個字符依次比較,相同則將指針移動一位直至比到相同的元素,返回指向其的指針
12、折半查找某數是否在升序數組中
#include<stdio.h> //p指向一維數組,n是數組長度,key為查找關鍵字 找到返回元素下標,否則返回-1 int search(int* p, int n, int key) {int low = 0, high = n-1, mid,result=-1;while(high > low) {//折半查找mid = (low + high) / 2;if (p[mid] == key) {result = mid;break;}else if (p[mid] > key) {//待查找數字小于中間數,即在左邊,需要縮小最大值high = mid - 1;} else {//在右邊,需要放大最小值low= mid + 1;}}return result; }//用折半查找法找某數是否在給定的升序數組中 int main() {int arr[10] = {1,2,3,4,5,6,7,8,9,10};int result = search(arr, 10, 8);printf("查找結果位于的下標:%d", result); }總結
- 上一篇: 计算机专业大几用到移动硬盘,大文件复制到
- 下一篇: 【渝粤教育】电大中专建筑材料 (2)作业