學(xué)習(xí)日記 | C語(yǔ)言經(jīng)典例題⑤(實(shí)例81-100)

?一顆斯特拉
【注】
1.標(biāo)有??的是值得多做的題目

  1. 題目來(lái)源于C語(yǔ)言經(jīng)典例題(菜鳥教程100例)

3.《學(xué)習(xí)日記 | C語(yǔ)言經(jīng)典例題③(實(shí)例41-60)》中題目比較偏,暫不更。


——3.3更新——

實(shí)例81:【求未知數(shù)】??II

題目:809*??=800*??+9*??,其中??代表的兩位數(shù),809*??為四位數(shù),8*??的結(jié)果為兩位數(shù),9*??的結(jié)果為3位數(shù)。求??代表的兩位數(shù),及809*??后的結(jié)果。

01程序分析:
暫無(wú)
02Bad Solution:
暫無(wú)
03Correct Solution:

#include <stdio.h>

int main(){

    long int a,b,i;
    a = 809;
    for(i = 10; i < 100; i++){
        b = i * a;
        if (b >= 1000 && b <= 10000 && 8 * i < 100 && 9 * i >= 100){//這里是將題目中的條件簡(jiǎn)化了,完整的為(b >= 1000 && b <= 10000 )&& (8*i>=10&&8 * i < 100) &&(9 * i >= 100&&9*i<1000),但是根據(jù)i的取值范圍,完整的條件中有的自然就滿足了,不用再說(shuō)明
            printf("\n%ld = 800 * %ld + 9 * %ld\n", b,i,i);
        }
    }
    return 0;
}

9708 = 800 * 12 + 9 * 12

04題目總結(jié):
暫無(wú)

實(shí)例82:【進(jìn)制數(shù)的轉(zhuǎn)換】??II

題目:八進(jìn)制轉(zhuǎn)換為十進(jìn)制

01程序分析:
02Bad Solution:
暫無(wú)
03Correct Solution:
【套路一】

#include<stdio.h>
#include<string.h>
int main()
{
    char num[100];
    int i,r=0;
    printf("請(qǐng)輸入一個(gè)八進(jìn)制:");
    gets(num);
    for(i=0;i<strlen(num);i++)
    {
        r=r*8+num[i]-'0';//為了得到十進(jìn)制的數(shù)(整型),需要將字符型的數(shù)字減去0的ASCII碼,用'0'表示!!!
    }
    printf("轉(zhuǎn)換為十進(jìn)制后為:%d",r);
}

【運(yùn)行結(jié)果】

請(qǐng)輸入一個(gè)八進(jìn)制:warning: this program uses gets(), which is unsafe.
16
轉(zhuǎn)換為十進(jìn)制后為:14

【套路二】
可以不添加上面第二個(gè)頭文件,用while循環(huán)來(lái)做。

#include<stdio.h>
int main()
{
    char num[100];
    int i=0,r=0;
    printf("請(qǐng)輸入一個(gè)八進(jìn)制:");
    gets(num);
    while(num[i]!='\0'){
        r=r*8+num[i]-'0';//為了得到十進(jìn)制的數(shù)(整型),需要將字符型的數(shù)字減去0的ASCII碼,用'0'表示!!!
        i++;
    }
    printf("轉(zhuǎn)換為十進(jìn)制后為:%d",r);
}

04題目總結(jié):
1.整形常量就是整常數(shù)。在C語(yǔ)言中,使用的整常熟有八進(jìn)制、十六進(jìn)制和十進(jìn)制三種。
1)十進(jìn)制整常數(shù):十進(jìn)制整常數(shù)沒(méi)有前綴。其數(shù)碼為0~9。(023不是合法的十進(jìn)制整常數(shù))
2)八進(jìn)制整常數(shù):八進(jìn)制整常數(shù)必須以0開頭,即以0作為八進(jìn)制數(shù)的前綴。數(shù)碼取值為0~7.八進(jìn)制數(shù)通常是無(wú)符號(hào)數(shù)。(-0127不是合法的八進(jìn)制數(shù))
八進(jìn)制數(shù)其實(shí)是由二進(jìn)制數(shù)每三位一組再轉(zhuǎn)化為十進(jìn)制數(shù)組成。
3)十六進(jìn)制整常數(shù):十六進(jìn)制整常數(shù)的前綴為0X或0x。其數(shù)碼取值為09,AF或a~f。(0x3H不是合法的十六進(jìn)制數(shù))
如果使用的數(shù)超過(guò)了各進(jìn)制數(shù)的范圍,就必須用長(zhǎng)整型數(shù)來(lái)表示。
2.八進(jìn)制與十進(jìn)制的轉(zhuǎn)換

  • 八進(jìn)制轉(zhuǎn)化為十進(jìn)制可以按照十進(jìn)制的算法來(lái)計(jì)算。
  • 十進(jìn)制轉(zhuǎn)化為八進(jìn)制的話可以先轉(zhuǎn)化為二進(jìn)制,再由二進(jìn)制轉(zhuǎn)化為八進(jìn)制,同樣也有直接由十進(jìn)制轉(zhuǎn)化為八進(jìn)制的方法。

3.每個(gè)字符變量被分配一個(gè)字節(jié)的內(nèi)存空間,因此只能存放一個(gè)字符。字符值是以ASCII碼的形式存放在變量的內(nèi)存單元之中的。
C語(yǔ)言允許把字符變量按整型量輸出,也允許把整形量按字符量輸出。
C語(yǔ)言允許字符變量參與數(shù)值計(jì)算,即用字符的ASCII碼參與運(yùn)算。

實(shí)例83:【奇數(shù)個(gè)數(shù)-先用排列組合把規(guī)律找出來(lái)】??II

題目:求0—7所能組成的奇數(shù)個(gè)數(shù)。(這個(gè)數(shù)最多八位,數(shù)字可以重復(fù)使用)

01程序分析:
0-7最少可組成一位數(shù)的奇數(shù),最多可組成八位數(shù)的奇數(shù)。這個(gè)問(wèn)題其實(shí)是一個(gè)排列組合的問(wèn)題。編寫程序時(shí),首先要找到規(guī)律。從該數(shù)為一位數(shù)到該數(shù)為8位數(shù)開始統(tǒng)計(jì)奇數(shù)的個(gè)數(shù):
① 當(dāng)該數(shù)為一位數(shù)時(shí),奇數(shù)個(gè)數(shù)為=4
②當(dāng)該數(shù)為二位數(shù)時(shí),奇數(shù)個(gè)數(shù)為=4*7
③ 當(dāng)該數(shù)為三位數(shù)時(shí),奇數(shù)個(gè)數(shù)為=4*8*7
……
⑧ 當(dāng)該數(shù)為八位數(shù)時(shí),奇數(shù)個(gè)數(shù)為=4*8^{6}*7
找到規(guī)律后,我們?cè)倬帉懗绦颉?br> 02Bad Solution:
暫無(wú)
03Correct Solution:

#include <stdio.h>

int main(){
    long int  s=4,sum=4;
    int i;
    for(i=2;i<=8;i++)
    {
        printf("%d位數(shù)為奇數(shù)的個(gè)數(shù)%ld\n", i-1, s);
        if(i==2)
            s=s*7;
        else if(i>2)
            s=s*8;
        sum=sum+s;
    }
    printf("%d位數(shù)為奇數(shù)的個(gè)數(shù)%ld\n", i-1, s);
    printf("奇數(shù)的總個(gè)數(shù)為:%ld\n", sum);
    return 0;
}

【運(yùn)行結(jié)果】

1位數(shù)為奇數(shù)的個(gè)數(shù)4
2位數(shù)為奇數(shù)的個(gè)數(shù)28
3位數(shù)為奇數(shù)的個(gè)數(shù)224
4位數(shù)為奇數(shù)的個(gè)數(shù)1792
5位數(shù)為奇數(shù)的個(gè)數(shù)14336
6位數(shù)為奇數(shù)的個(gè)數(shù)114688
7位數(shù)為奇數(shù)的個(gè)數(shù)917504
8位數(shù)為奇數(shù)的個(gè)數(shù)7340032
奇數(shù)的總個(gè)數(shù)為:8388608

04題目總結(jié):
暫無(wú)

實(shí)例84:【分解偶數(shù)】??II

題目:一個(gè)偶數(shù)(>2)總能表示為兩個(gè)素?cái)?shù)之和。

01程序分析:
暫無(wú)
02Bad Solution:
暫無(wú)
03Correct Solution:

#include<stdio.h>
#include<math.h>
int isprime(int n);
int main()
{
    int even,i;
    do{
        printf("請(qǐng)輸入一個(gè)偶數(shù)(>2):");
        scanf("%d",&even);
    }while(even%2!=0||even==2);
    //其中一個(gè)素?cái)?shù)可以用做差的方法表示,變量越少越好。
    for(i=2;i<even;i++) {
        if(isprime(i)&&isprime(even-i))
            break;
    }
    //一定能分解嗎?這樣的分解是唯一的嗎??。。。ㄟ@就是“哥德巴赫猜想”啊)
    printf("%d = %d + %d",even,i,even-i);
    return 0;
}

int isprime(int n){
    int i;
    for(i=2;i<sqrt(n)+1;i++)//記住這里一個(gè)數(shù)非本身因子的范圍大小,常用
        if(n%i==0)return 0;
    return 1;
}

請(qǐng)輸入一個(gè)偶數(shù)(>2):8
8 = 3 + 5

04題目總結(jié):
數(shù)論中有一個(gè)有趣的理論至今既沒(méi)有被證實(shí)也沒(méi)有被推翻,這就是哥德巴赫在1742年提出的“哥德巴赫猜想”。他聲稱,“任何一個(gè)偶數(shù)都可以表示成兩個(gè)質(zhì)數(shù)之和”。

實(shí)例85:【素?cái)?shù)+整除】??II

題目:判斷一個(gè)素?cái)?shù)能被幾個(gè)9整除。(判斷一個(gè)素?cái)?shù)能整除幾個(gè)9組成的數(shù)吧)

01程序分析:
暫無(wú)
02Bad Solution:

include<stdio.h>
int main()
{
    int i,num,sum=9;
    printf("請(qǐng)輸入一個(gè)素?cái)?shù):");
    scanf("%d",&num);
    for(i=1;;i++){
        if(sum%num==0){break;}
        sum=sum*10+9;
    }
    printf("%d 能被 %d 個(gè)9組成的 %d 整除",num,i,sum);
}

【運(yùn)行結(jié)果】

請(qǐng)輸入一個(gè)素?cái)?shù):13
13 能被 6 個(gè)9組成的 999999 整除

【缺陷】
這里變量sum較大,改為長(zhǎng)整型,類型符號(hào)說(shuō)明符為long int或者long。在內(nèi)存中占4個(gè)字節(jié)。
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,num;
    long int sum=9;
    printf("請(qǐng)輸入一個(gè)素?cái)?shù):");
    scanf("%d",&num);
    for(i=1;;i++){
        if(sum%num==0){break;}
        sum=sum*10+9;
    }
    printf("%d 能被 %d 個(gè) 9 組成的 %ld 整除",num,i,sum);
}

04題目總結(jié):
暫無(wú)

實(shí)例88:【循環(huán)】

題目:讀取7個(gè)數(shù)(1—50)的整數(shù)值,每讀取一個(gè)值,程序打印出該值個(gè)數(shù)的 *。

01程序分析:
固定了長(zhǎng)度,用數(shù)組來(lái)做。輸入后就操作。
02Bad Solution:

#include<stdio.h>
int main()
{
    int i,j,a[7];
    printf("請(qǐng)輸入7個(gè)數(shù)(1-50):\n");
    for(i=0;i<7;i++){
        scanf("%d",&a[i]);
        for(j=0;j<a[i];j++)
            printf("*");
        printf("\n");
    }
    return 0;
}

【運(yùn)行結(jié)果】

結(jié)果02

【缺陷】
考慮復(fù)雜了,這里用數(shù)組意義不大。題目比較簡(jiǎn)單,出現(xiàn)了輸入的限制,最好寫上例外。
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,j,a;
    printf("請(qǐng)輸入7個(gè)數(shù)(1-50):\n");
    for(i=0;i<7;i++){
        scanf("%d",&a);
        if(a>50){
            printf("不符合要求,請(qǐng)重新輸入!");
        }
        else {
            for (j = 0; j < a; j++)
                printf("*");
        }
        printf("\n");
    }
    return 0;
}

04題目總結(jié):
暫無(wú)

實(shí)例89:【加密-數(shù)字變換】

題目:某個(gè)公司采用公用電話傳遞數(shù)據(jù),數(shù)據(jù)是四位的整數(shù),在傳遞過(guò)程中是加密的,加密規(guī)則如下: 每位數(shù)字都加上5,然后用和除以10的余數(shù)代替該數(shù)字,再將第一位和第四位交換,第二位和第三位交換。

01程序分析:
02Bad Solution:
暫無(wú)
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,j,a[4],num,temp;
    printf("請(qǐng)輸入一個(gè)四位數(shù):");
    scanf("%d",&num);
    //先提取每一位上的數(shù)放進(jìn)一個(gè)數(shù)組里
    a[0]=num/1000;
    a[1]=num%1000/100;
    a[2]=num%100/10;
    a[3]=num%10;
    //每位數(shù)做變換
    for(i=0;i<4;i++){
        a[i]=(a[i]+5)%10;
    }
    //交換1、4位和2、3位
    for(i=0;i<3/2;i++) {
        temp = a[i];
        a[i] = a[3 - i];
        a[3 - i] = temp;
    }
    //打印結(jié)果
    printf("加密后的為:");
    for(i=0;i<4;i++)
        printf("%d",a[i]);
}

【運(yùn)行結(jié)果】

請(qǐng)輸入一個(gè)四位數(shù):1234
加密后的為:9786

04題目總結(jié):

實(shí)例96:【子串】??

題目:計(jì)算字符串中子串出現(xiàn)的次數(shù) 。

01程序分析:
02Bad Solution:

#include<stdio.h>
#include<string.h>

int main(){
    char father[200],son[200];
    gets(father);
    gets(son);
    int i,j,k,count=0;
    for(i=0;i<strlen(father);i++) {
        if (father[i] ==son[0]) {//son的第一個(gè)元素出現(xiàn)了,比較后面的元素是否相同
            j = i;
            k++;
            while (son[k] != '\0') {
                if (son[k + 1] == father[j]) {
                    j++;
                    k++;
                }
                else {
                    break;
                }
            }
            if (son[k] == '\0') {
                count++;
            }
        }
    }
    printf("%d",count);
}

【運(yùn)行結(jié)果】

abababab
aba
3

03Correct Solution:

#include<stdio.h>
#include<string.h>
int main()
{
    int i,j,k,TLen,PLen,count=0;
    char T[50],P[10];
    printf("請(qǐng)輸入兩個(gè)字符串,以回車隔開,母串在前,子串在后:\n");
    gets(T);
    gets(P);
    TLen=strlen(T);
    PLen=strlen(P);
    for(i=0;i<=TLen-PLen;i++)//優(yōu)化運(yùn)行時(shí)間
    {
        for(j=0,k=i;j<PLen&&P[j]==T[k];j++,k++)
            ;//這里是空語(yǔ)句,不能刪掉,不滿足條件就不執(zhí)行啦
        if(j==PLen)count++;
    }
    printf("%d\n",count);
    return 0;
}

【運(yùn)行結(jié)果】

abababab
aba
3


實(shí)例1:【C語(yǔ)言交換行】

題目:給定一個(gè) 5*5 的矩陣(數(shù)學(xué)上,一個(gè) r×c 的矩陣是一個(gè)由 r 行 c 列元素排列成的矩形陣列),將第 n 行和第 m 行交換,輸出交換后的結(jié)果。
輸入共 6 行,前 5 行為矩陣的每一行元素, 元素與元素之間以一個(gè)空格分開。
第 6 行包含兩個(gè)整數(shù) m、n,以一個(gè)空格分開。(1 <= m,n <= 5)輸出輸出交換之后的矩陣,矩陣的每一行元素占一行,元素之間以一個(gè)空格分開。樣例輸入:


屏幕快照 2020-03-03 下午9.43.01.png

01程序分析:
暫無(wú)
02Bad Solution:
暫無(wú)
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,j,a[5][5],m,n,temp;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            scanf("%d",&a[i][j]);
    scanf("%d",&m);
    scanf("%d",&n);
    for(i=0;i<5;i++){
        temp=a[m-1][i];
        a[m-1][i]=a[n-1][i];
        a[n-1][i]=temp;
    }
    for(i=0;i<5;i++) {
        for (j = 0; j < 5; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
    return 0;
}

【運(yùn)行結(jié)果】

結(jié)果03

04題目總結(jié):
暫無(wú)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容