C语言常见的习题
C語言常見的習題
- 給你一串數,輸出最大的數
- 輸出1-n之間的質數
- 剔除掉多余的空格
- 用遞歸計算1~n的和
- 統計單詞序列,每個單詞的長度
- 剔除序列中重復出現的數
- 把一個十進制正整數轉化成八進制。
- 統計一個數轉化為二進制后1的個數
給你一串數,輸出最大的數
#include<stdio.h> int main(void) {int a[5]={34,56,2,33,7};int i,max;max=0;for(i=0;i<5;i++){if(a[i]>a[max])max=i;}printf("%d\n",a[max]);return 0; }輸出1-n之間的質數
#include<stdio.h> #include<math.h> void bool_number(int n); int main(void) {int n=100;bool_number(n);return 0; } void bool_number(int n) {int i,j;int temp=1;printf("2 ");for(i=3;i<=n;i++){temp=1;//判斷是不是質數for(j=2;j<=sqrt(i);j++){if(i%j==0)//只要能整除,直接跳出來{temp=0;break;}}if(temp==1)printf("%d ",i);} }為啥判斷一個數是不是質數,判斷除數從2到 n開根號就行了?
我們以36為例,它的因子有:1,2,3,4,6,9,12,18,36。
1和36,2和18,3和12,4和9,各為一對,6單獨。
成對的因子都是關于6 對稱的 ,而 6是 36開方得到的。所以判斷一個數是不是質數,判斷除數從2到 n開根號就行了。
下面從幾何的方向上看:
面積為36的長方形關于紅線對稱(也可以說關于,以36開方為邊長的正方形對稱)。
剔除掉多余的空格
一個句子中也許有多個連續空格,過濾掉多余的空格,只留下一個空格。
例:helllo word c 剔除后:hello word c #include<stdio.h> #include<string.h> int main(void) {char a[201];//輸入的數據int i=1;gets(a);printf("%c",a[0]);while(a[i]!='\0'){if(a[i-1]==' '&&a[i]==' ')//如果當前位置和前面的都是空格就不輸出{i++;continue;}elseprintf("%c",a[i]);i++;}return 0; }用遞歸計算1~n的和
#include<stdio.h> int fun(int n); int main(void) {printf("%d",fun(10));return 0; } int fun(int n) {return (n==1) ? 1:(n+fun(n-1)); }計算過程:
先判斷 10是否等于 1 不等于執行后面的 即 10+fun(9)
再計算 10+fun(9) 即 10+9+fun(8) 這時候上面的 fun(9)=9+fun(8)
…
…
即: 10+9+8+…+1
統計單詞序列,每個單詞的長度
輸入一行單詞序列,相鄰單詞之間有1個或多個空格間隔,請對應地計算各個單詞的長度。
注意,如果有標點符號(如連字符,逗號,句號),標點符號算作與之相連的詞的一部分。沒有被空格間隔開的符號串,都算作單詞。
例:
- 輸入:She was born in 1990-01-02 and from Beijing city.
- 輸出: 3,3,4,2,10,3,4,7,5
剔除序列中重復出現的數
給定含有 nn 個整數的序列,要求對這個序列進行去重操作。所謂去重,是指對這個序列中每個重復出現的數, 只保留該數第一次出現的位置,刪除其余位置。 例: 12 34 78 12 66 剔除后: 12 34 78 66 #include<stdio.h> int main(void) {int n;int i=0;int j=0;int a[20000]={0};scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}for(i=0;i<n;i++){for(j=i+1;j<n;j++)//從這個位置后面的所有數中查找{if(a[i]==a[j])//如果重復賦值為-1 ,輸出時只要輸出非-1的就可以了{a[j]=-1;}}}for(i=0;i<n;i++){ if(a[i]!=-1)printf("%d ",a[i]);}return 0; }把一個十進制正整數轉化成八進制。
#include<stdio.h> int main(void) {int number=0;int a[100]={0};//存儲數據int n=0;//保存位數int i=0;scanf("%d",&number);while(number>0){a[i]=number%8;number=number/8;i++;//下標加1n++;//位數加1}for(i=n-1;i>=0;i--)//倒著輸出,因為保存的時候是從后向前保存的。{printf("%d",a[i]);}return 0; }統計一個數轉化為二進制后1的個數
//這個是我做題的時候遇到的一個比較巧妙的方法 int func(int x){int count=0;while (x){count++;x=x&(x-1);//與運算}return count;//統計的位數 } 例: 以15為例 count=1時 1111 & 1110 結果 1110 count=2時 1110 & 1101 結果 1100 count=3時 1100 & 1001 結果 1000 count=4時 1000 & 0111 結果 0000 不滿足了 返回 統計的值總結
- 上一篇: 概率论 第三章 多维随机变量及其分布
- 下一篇: 矩阵的分解与变换