天天看点

C语言练习2:多重循环,进制,数组运用,字符串

练习题目录

    • 2122 分解质因数
    • 2145 打印月份
    • 2135 价钱统计
    • 1922 乘法
    • 1955 过欠判断
    • 1912 咖啡馆
    • 1915 西湖游船
    • 2113 丢失的数字
    • 2149 字符串出现位置

本文列出了 51nod 中几个比较有代表性的题目

2412 2089 2413 2414 2088 2091 2122 2145 2135 2118 2101 2119 2102 2112

1922 2121 2130 1956 2092 1911 1955 1959 1912 1915 2113 2114 2150 2153

2148 2149 1950

如需以上题目c语言代码可私信我获取

2122 分解质因数

题目:

请你帮小瓜将正整数n分解质因数,并从小到大输出所有的质因数(如果一个质因数出现多次,则输出多次)

C语言练习2:多重循环,进制,数组运用,字符串

解题:

#include <stdio.h>

int main(){
        int n;
        scanf("%d",&n);
        for (int i=2;i<=n;i++){
                while(n%i==0){
                        printf("%d\n",i);
                        n=n/i;
                }
        }
}
           

2145 打印月份

题目(有误):

给你一个年份 y 和一个月份 m,请你按照样例的格式打印出 y 年第 m 月的月历。例如当 y=2015,m=1 时,2015 年 1 月的月历打印效果就应该如下:

每一行为代表星期的字母,第一个字母的左边没有空格,两个字母之间有三个空格分隔。接下来的几行是第 m 月的日期,每一列的数都与本列的第一个字母左对齐,同一行的两个日期之间要有若干个空格分隔。

为了简化题目的难度,输入还会给出一个正整数 n(n<8),表示第 y 年的 1 月 1 日 是星期 n。例如 2015 1 4 的含义是要输出 2015 年 1 月的日历,2015 年 1 月 1 日是星期四

特别注意输入的n表示y年1月1日是星期n,而不是m月1日

C语言练习2:多重循环,进制,数组运用,字符串

解题:

int main(){
        int y,m,n;
        scanf("%d%d%d",&y,&m,&n);
        printf("S   M   T   W   T   F   S\n");
        int e=(y%4==0 && y%100!=0 || y%400==0)?29:28;
        int days[12]={31,e,31,30,31,30,31,31,30,31,30};
        for(int i=0;i<n;++i){
                printf("    ");
        }
        for(int i=1;i<=9;++i){
                printf("%d   ",i);
                if((n+i)%7==0){
                        printf("\n");
                }
        }
        for(int i=10;i<=days[m-1];++i){
                printf("%d  ",i);
                if((n+i)%7==0){
                        printf("\n");
                }
        }
        printf("\n");
}
           

2135 价钱统计

题目:

夏天到了,超市里摆满了各种各样的应季水果。现在知道:西瓜的价钱是每斤 1.2 元;桃子的价格是每斤 3.5 元;葡萄的价格是每斤 4.5 元;苹果的价钱是每斤 5 元。现在分别给出上述四种所购买的斤数(均不超过 20),请你编写程序帮助售货员阿姨计算并依次输出顾客购买四种水果需要的钱数及总钱数

C语言练习2:多重循环,进制,数组运用,字符串
C语言练习2:多重循环,进制,数组运用,字符串

解题:

计算机通过 %.1f 可以让浮点数保留 1 位小数输出,但保留的是精读为四舍六入五成双,我们需要改为四舍五入

例如:

9.8249=9.82(小于5,舍掉), 9.82671=9.83(大于5进位)

9.8350=9.84(奇数进位), 9.8351=9.84(奇数进位)

9.8250=9.82(偶数舍弃), 9.82501=9.82(偶数舍弃)

#include <stdio.h>

int main(){
        float m1,m2,m3,m4;
        scanf("%f%f%f%f",&m1,&m2,&m3,&m4);
        int t1,t2,t3,t4;
        int sum=0;
        // 强制让小数点后第二位是5的数进位
        t1=(int)((1.2*m1)*10+0.5);
        t2=(int)((3.5*m2)*10+0.5);
        t3=(int)((4.5*m3)*10+0.5);
        t4=(int)((5.0*m4)*10+0.5);
        printf("%.1f\n",t1/10.0);
        printf("%.1f\n",t2/10.0);
        printf("%.1f\n",t3/10.0);
        printf("%.1f\n",t4/10.0);
        sum=(int)((1.2*m1+3.5*m2+4.5*m3+5*m4)*10+0.5);
        printf("%.1f\n",sum/10.0);
}
           

假设得出的数是9.251,强制过程为:

9.251 => 92.51 => 93.01 => 93 => 9.3

1922 乘法

题目:

给出三个整数a,b,c,请找出最小的进制K(2<=K<=16)使得a*b=c在K进制下成立。

比如a=11,b=10,c=110。那么当K=2的时候 (11)2 ∗ (10)2 = (110)2 成立,当K=10的时候 (11)10 ∗ (10)10 = (110)10 也成立

C语言练习2:多重循环,进制,数组运用,字符串

解题:

函数 Getnum 是用来把其他进制的数转化为10进制,在函数中还需要检查输入的数能不能是不是某一进制的数

#include <stdio.h>
#include <math.h>

int Getnum(int n,int m){    // m为进制
        int count = 0;     // 每次次方增加1
        int sum = 0;
        if (n%10 >= m){
                return -1;
        }else{
                sum = n%10;
        }
        while(n){
                n = n/10;
                count++;
                if (n%10 >= m){
                        return -1;
                }else{
                        sum = sum + (n%10)*pow(m,count);   //m的count次方乘某一位再加一起
                }
        }
        return sum;
}

int main(){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        int count = 0;
        for(int i=2;i<=16;++i){
                int s1 = Getnum(a,i);
                int s2 = Getnum(b,i);
                int s3 = Getnum(c,i);

                if(s1*s2 == s3){
                        printf("%d\n",i);
                        count++;
                        break;
                }
        }

        if (count == 0){
                printf("0\n");
                return 0;
        }
}
           

1955 过欠判断

题目:

如果a, b, c三个是整数,并且满足a = bc,那么就说a是b或者c的倍数;b和c是a的因子。 如果c不是1/-1, 那么b就叫作a的完全因子。 对于偶数,都是2的倍数比如-4, 0, 2, 10;一个完美数是一个正整数,并且它等于所有正完全因子之和;比如6,等于1 + 2 + 3,而28,等于1 + 2 + 4 + 7 + 14,都是完美数。而一个不是完美的正整数要么是过数,要么是欠数;取决于正完全因子之和与该数字比较的结果。比如9的正完全因子是1, 3,1+4〈9,所以9是 欠数;而12,正完全因子是1, 2, 3, 4, 6,这些数字之和>12,所以12是过数。 给定一个正整数,判断它是完美数,过数还是欠数

C语言练习2:多重循环,进制,数组运用,字符串
C语言练习2:多重循环,进制,数组运用,字符串

解题:

func函数用来找除了输入数本身的其他因子,并累加

#include <stdio.h>

int func(int a){
        int b=0;
        for(int i=1;i<a;++i){
                if(a%i == 0){
                        b=b+i;
                }
        }
        return b;
}

int main(){
        int n;
        scanf("%d",&n);
        int arr[n];
        for(int i=0;i<n;++i){
                scanf("%d",&arr[i]);
        }

        for(int i=0;i<n;++i){
                int sum = func(arr[i]);
                if(sum>arr[i]){
                        printf("G\n");
                }else if(sum<arr[i]){
                        printf("Q\n");
                }else{
                        printf("E\n");
                }
        }
}
           

1912 咖啡馆

题目:

Noder咖啡馆里面有N个座位,每天会有若干个顾客来店里面消费,会得到相应的服务。一个顾客占一个位置,顾客离开之后位置就会空出来。如果顾客来了之后没有位置,那么顾客就会直接离开,也就得不到服务。

现在已知座位数N,以及一天之内顾客来走的顺序,请统计一下有多少顾客没有得到服务

C语言练习2:多重循环,进制,数组运用,字符串
C语言练习2:多重循环,进制,数组运用,字符串

解题:

#include <stdio.h>

int main(){
        int res;     // 剩余座位数
        scanf("%d",&res);
        char str[100];     // 来回人情况
        scanf("%s",str);   
        int flag[30]={0};  // 标记某个人是否来过
        int cnt=0;  // 统计未接受到服务的人
        int c=0;   // 字母位置
        for(int i=0;str[i]!='\0';++i){
                c=str[i]-'A'+1;
                if(!flag[c] && res>=1){
                        flag[c]=1;  // 来了标记为1
                        --res;
                }else if(!flag[c] && res==0){
                        ++cnt;
                        ++i;
                }else{
                        flag[c]=0;   // 走了标记为0
                        ++res;
                }
        }
        printf("%d\n",cnt);
}
           

1915 西湖游船

题目:

有n名游客在西湖游玩,现在他们要上船观光。游客编号1到n。船的最大承重为W。第i个人的重量为c[i]。现在有若干次游客上下船的操作,请统计一下整个过程中船所承受过的最大总重量是多少。

C语言练习2:多重循环,进制,数组运用,字符串
C语言练习2:多重循环,进制,数组运用,字符串

解题:

#include <stdio.h>

int main(){
        int n;  // 人数
        scanf("%d",&n);
        int a;  // 动作次数
        scanf("%d",&a);
        int all;  // 船承重总重量
        scanf("%d",&all);
        int arr[n];   // 记录重量
        for(int i=0;i<n;++i){
                scanf("%d",&arr[i]);
        }
        int arr1[a];  // 记录动作
        for(int i=0;i<a;++i){
                scanf("%d",&arr1[i]);
        }
        int flag[100]={0};
        int sum=0;
        int max=0;
        for(int i=0;i<a;++i){
                if(!flag[arr1[i]]){
                        flag[arr1[i]]=1;
                        sum=sum+arr[arr1[i]-1];
                }else{
                        flag[arr1[i]]=0;
                        sum=sum-arr[arr1[i]-1];
                }
                if(sum>all){
                        printf("Oh, My God!\n");
                        return 0;
                }
                if(sum>max){
                        max=sum;
                }
        }
        printf("%d\n",max);
}
           

2113 丢失的数字

题目:

给你m个1到n之间的整数,你能找出1到n中的哪些整数没有出现吗?

C语言练习2:多重循环,进制,数组运用,字符串

解题:

数组用于标记

#include <stdio.h>

int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        int arr[100000]={0};
        int j;
        for(int i=0;i<m;++i){
                scanf("%d",&j);
                arr[j]=1;
        }

        for(int i=1;i<=n;++i){
                if(arr[i]==0){
                        printf("%d\n",i);
                }
        }
}
           

2149 字符串出现位置

题目:

给你两个字符串,一个母串,一个子串,请你找出子串第一次在母串中出现的位置。如果子串没有在母串中出现过,则输出-1。

例如子串ab在母串dceab中第一次出现的位置是3,而子串abc则在dceab中没有出现过。

C语言练习2:多重循环,进制,数组运用,字符串

解题:

count 用来对合贴的字符数,与 len2 作比较,c用来标记有没有找到出现的位置

#include <stdio.h>

int main(){
        char s1[10000];
        char s2[10000];
        scanf("%s %s",&s1,&s2);
        int len2=0;
        int c=0;
        for(int i=0;s2[i]!='\0';++i){
                ++len2;
        }

        for(int i=0;s1[i]!='\0';++i){
                int count=0;
                for(int j=0;s2[j]!='\0';++j){
                        if(s2[j]==s1[i+j]){
                                ++count;
                        }
                }
                if(count==len2){
                        printf("%d\n",i);
                        c=1;
                        break;
                }
        }

        if(c==0){
                printf("-1\n");
        }
}
           

继续阅读