学习日记 | C语言经典例题⑤(实例81-100)

©一颗斯特拉
【注】
1.标有❤️的是值得多做的题目

  1. 题目来源于C语言经典例题(菜鸟教程100例)

3.《学习日记 | C语言经典例题③(实例41-60)》中题目比较偏,暂不更。


——3.3更新——

实例81:【求未知数】❤️II

题目:809*??=800*??+9*??,其中??代表的两位数,809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

01程序分析:
暂无
02Bad Solution:
暂无
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){//这里是将题目中的条件简化了,完整的为(b >= 1000 && b <= 10000 )&& (8*i>=10&&8 * i < 100) &&(9 * i >= 100&&9*i<1000),但是根据i的取值范围,完整的条件中有的自然就满足了,不用再说明
            printf("\n%ld = 800 * %ld + 9 * %ld\n", b,i,i);
        }
    }
    return 0;
}

9708 = 800 * 12 + 9 * 12

04题目总结:
暂无

实例82:【进制数的转换】❤️II

题目:八进制转换为十进制

01程序分析:
02Bad Solution:
暂无
03Correct Solution:
【套路一】

#include<stdio.h>
#include<string.h>
int main()
{
    char num[100];
    int i,r=0;
    printf("请输入一个八进制:");
    gets(num);
    for(i=0;i<strlen(num);i++)
    {
        r=r*8+num[i]-'0';//为了得到十进制的数(整型),需要将字符型的数字减去0的ASCII码,用'0'表示!!!
    }
    printf("转换为十进制后为:%d",r);
}

【运行结果】

请输入一个八进制:warning: this program uses gets(), which is unsafe.
16
转换为十进制后为:14

【套路二】
可以不添加上面第二个头文件,用while循环来做。

#include<stdio.h>
int main()
{
    char num[100];
    int i=0,r=0;
    printf("请输入一个八进制:");
    gets(num);
    while(num[i]!='\0'){
        r=r*8+num[i]-'0';//为了得到十进制的数(整型),需要将字符型的数字减去0的ASCII码,用'0'表示!!!
        i++;
    }
    printf("转换为十进制后为:%d",r);
}

04题目总结:
1.整形常量就是整常数。在C语言中,使用的整常熟有八进制、十六进制和十进制三种。
1)十进制整常数:十进制整常数没有前缀。其数码为0~9。(023不是合法的十进制整常数)
2)八进制整常数:八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7.八进制数通常是无符号数。(-0127不是合法的八进制数)
八进制数其实是由二进制数每三位一组再转化为十进制数组成。
3)十六进制整常数:十六进制整常数的前缀为0X或0x。其数码取值为09,AF或a~f。(0x3H不是合法的十六进制数)
如果使用的数超过了各进制数的范围,就必须用长整型数来表示。
2.八进制与十进制的转换

  • 八进制转化为十进制可以按照十进制的算法来计算。
  • 十进制转化为八进制的话可以先转化为二进制,再由二进制转化为八进制,同样也有直接由十进制转化为八进制的方法。

3.每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。
C语言允许把字符变量按整型量输出,也允许把整形量按字符量输出。
C语言允许字符变量参与数值计算,即用字符的ASCII码参与运算。

实例83:【奇数个数-先用排列组合把规律找出来】❤️II

题目:求0—7所能组成的奇数个数。(这个数最多八位,数字可以重复使用)

01程序分析:
0-7最少可组成一位数的奇数,最多可组成八位数的奇数。这个问题其实是一个排列组合的问题。编写程序时,首先要找到规律。从该数为一位数到该数为8位数开始统计奇数的个数:
① 当该数为一位数时,奇数个数为=4
②当该数为二位数时,奇数个数为=4*7
③ 当该数为三位数时,奇数个数为=4*8*7
……
⑧ 当该数为八位数时,奇数个数为=4*8^{6}*7
找到规律后,我们再编写程序。
02Bad Solution:
暂无
03Correct Solution:

#include <stdio.h>

int main(){
    long int  s=4,sum=4;
    int i;
    for(i=2;i<=8;i++)
    {
        printf("%d位数为奇数的个数%ld\n", i-1, s);
        if(i==2)
            s=s*7;
        else if(i>2)
            s=s*8;
        sum=sum+s;
    }
    printf("%d位数为奇数的个数%ld\n", i-1, s);
    printf("奇数的总个数为:%ld\n", sum);
    return 0;
}

【运行结果】

1位数为奇数的个数4
2位数为奇数的个数28
3位数为奇数的个数224
4位数为奇数的个数1792
5位数为奇数的个数14336
6位数为奇数的个数114688
7位数为奇数的个数917504
8位数为奇数的个数7340032
奇数的总个数为:8388608

04题目总结:
暂无

实例84:【分解偶数】❤️II

题目:一个偶数(>2)总能表示为两个素数之和。

01程序分析:
暂无
02Bad Solution:
暂无
03Correct Solution:

#include<stdio.h>
#include<math.h>
int isprime(int n);
int main()
{
    int even,i;
    do{
        printf("请输入一个偶数(>2):");
        scanf("%d",&even);
    }while(even%2!=0||even==2);
    //其中一个素数可以用做差的方法表示,变量越少越好。
    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++)//记住这里一个数非本身因子的范围大小,常用
        if(n%i==0)return 0;
    return 1;
}

请输入一个偶数(>2):8
8 = 3 + 5

04题目总结:
数论中有一个有趣的理论至今既没有被证实也没有被推翻,这就是哥德巴赫在1742年提出的“哥德巴赫猜想”。他声称,“任何一个偶数都可以表示成两个质数之和”。

实例85:【素数+整除】❤️II

题目:判断一个素数能被几个9整除。(判断一个素数能整除几个9组成的数吧)

01程序分析:
暂无
02Bad Solution:

include<stdio.h>
int main()
{
    int i,num,sum=9;
    printf("请输入一个素数:");
    scanf("%d",&num);
    for(i=1;;i++){
        if(sum%num==0){break;}
        sum=sum*10+9;
    }
    printf("%d 能被 %d 个9组成的 %d 整除",num,i,sum);
}

【运行结果】

请输入一个素数:13
13 能被 6 个9组成的 999999 整除

【缺陷】
这里变量sum较大,改为长整型,类型符号说明符为long int或者long。在内存中占4个字节。
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,num;
    long int sum=9;
    printf("请输入一个素数:");
    scanf("%d",&num);
    for(i=1;;i++){
        if(sum%num==0){break;}
        sum=sum*10+9;
    }
    printf("%d 能被 %d 个 9 组成的 %ld 整除",num,i,sum);
}

04题目总结:
暂无

实例88:【循环】

题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的 *。

01程序分析:
固定了长度,用数组来做。输入后就操作。
02Bad Solution:

#include<stdio.h>
int main()
{
    int i,j,a[7];
    printf("请输入7个数(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;
}

【运行结果】

结果02

【缺陷】
考虑复杂了,这里用数组意义不大。题目比较简单,出现了输入的限制,最好写上例外。
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,j,a;
    printf("请输入7个数(1-50):\n");
    for(i=0;i<7;i++){
        scanf("%d",&a);
        if(a>50){
            printf("不符合要求,请重新输入!");
        }
        else {
            for (j = 0; j < a; j++)
                printf("*");
        }
        printf("\n");
    }
    return 0;
}

04题目总结:
暂无

实例89:【加密-数字变换】

题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

01程序分析:
02Bad Solution:
暂无
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,j,a[4],num,temp;
    printf("请输入一个四位数:");
    scanf("%d",&num);
    //先提取每一位上的数放进一个数组里
    a[0]=num/1000;
    a[1]=num%1000/100;
    a[2]=num%100/10;
    a[3]=num%10;
    //每位数做变换
    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;
    }
    //打印结果
    printf("加密后的为:");
    for(i=0;i<4;i++)
        printf("%d",a[i]);
}

【运行结果】

请输入一个四位数:1234
加密后的为:9786

04题目总结:

实例96:【子串】❤️

题目:计算字符串中子串出现的次数 。

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的第一个元素出现了,比较后面的元素是否相同
            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);
}

【运行结果】

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("请输入两个字符串,以回车隔开,母串在前,子串在后:\n");
    gets(T);
    gets(P);
    TLen=strlen(T);
    PLen=strlen(P);
    for(i=0;i<=TLen-PLen;i++)//优化运行时间
    {
        for(j=0,k=i;j<PLen&&P[j]==T[k];j++,k++)
            ;//这里是空语句,不能删掉,不满足条件就不执行啦
        if(j==PLen)count++;
    }
    printf("%d\n",count);
    return 0;
}

【运行结果】

abababab
aba
3


实例1:【C语言交换行】

题目:给定一个 5*5 的矩阵(数学上,一个 r×c 的矩阵是一个由 r 行 c 列元素排列成的矩形阵列),将第 n 行和第 m 行交换,输出交换后的结果。
输入共 6 行,前 5 行为矩阵的每一行元素, 元素与元素之间以一个空格分开。
第 6 行包含两个整数 m、n,以一个空格分开。(1 <= m,n <= 5)输出输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。样例输入:


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

01程序分析:
暂无
02Bad Solution:
暂无
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;
}

【运行结果】

结果03

04题目总结:
暂无

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容