1、字符串包含最多的字符及其个数
#include<stdio.h>int main(){ int i; char arr[1000] = { 0 };//定义字符串数组arr,初始化为0 gets(arr);//从键盘输入字符串给arr // printf("%s\n",arr);//输出字符串数组 // for(i=0;i<5;i++){ // printf("%c\n",arr[i]);//逐个输出字符串 // } int take[26] = { 0 }, A = 0;//定义数组take //知道次数用for,不知道次数用while while (arr[A] != '\0') //gets()输入时用'\0',getchar()用'\n' { take[arr[A] - 'a']++;//判断每个字符出现的次数,take[0]表示a出现的次数... A++;//往后循环 } int max = 0, word = 0; //初始化 for (A = 1; A <= 26; A++) { printf("%d",take[n-1]);//输出数组,直观的看到每个字符出现的次数 if (take[A] > take[max]) //找出次数最大的数。A从1开始,因为max初试为0 { max = A; } } printf("%c\n%d", 'a' + max, take[max]); return 0;}
2、输出数组的三种方法
下标法#include <stdio.h>void main(){ int i; int a[10]={1,2,3,4,5,6,7,8,9,10}; for(i = 0 ;i < 10; i++) { printf("%d ",a[i]); } printf("\n");}通过数组名计算数组元素地址,找出元素的值#include <stdio.h>void main(){ int i; int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; p = a; for( i = 0 ; i < 10 ; i++ ) { printf("%d ",*(p+i) ); } printf("\n");}用指针变量指向数组元素。#include <stdio.h>void main(){ int i; int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; for( p = a; p < (a+10) ;p++ ) { printf("%d ",*p); } printf("\n");}计算数组元素个数sizeof()#include <stdio.h>int main(){ int arr[10] = { 0 }; int sz = sizeof(arr) / sizeof(arr[0]); printf("%d\n", sz); return 0;}
3、计算成绩的及格率和优秀率
#include <stdio.h>int main() { int n,pass_num=0,excell_num=0;//初始化及格人数和优秀人数 float pass_rate,excell_rate;//浮点型 及格率和优秀率 int score; //学生分数 scanf("%d",&n); //学生人数 for(int i=0;i<n;i++){ scanf("%d",&score); if(score>=85){ excell_num++; pass_num++; }else if(score>=60){ pass_num++; } } pass_rate=(pass_num*100.0)/n; excell_rate=(excell_num*100.0)/n; printf("%.0f%%\n%.0f%%",pass_rate,excell_rate); //输出浮点数的整数部分,不输出小数点和小数点以下部分。小数部分 4 舍 5 入。 return 0;}
4、请问要制作所有的 1到2020 号门牌,总共需要多少个字符 2?
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ int count=0; for(int i=1;i<=2020;i++) { for(int j=i;j>0;j=j/10) { if(j%10==2) { count++; } } } printf("%d",count); // 请在此输入您的代码 return 0;}
#include <stdio.h>int main(){ int count = 0; for (int i = 0; i < 2021;i++){ int num = i; while(num){ if(num % 10 == 2){ count++;} num /= 10; } } printf("%d", count); return 0;}
5、0 到 9 的卡片各 2021 张,共 20210 张,请问可以从 1 拼到多少?
#include <stdio.h>int main(void){ int i,t,sum=0; for(i=1;;i++) { for(t=i;t!=0;t/=10) if(t%10==1) sum++; if(sum>=2021) goto end; } end:printf("%d",i); return 0;}
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ int sum=2021;int j;for( j=1;j>0;j++){ for(int i=j;i>0;i/=10){ if((i%10)==1){ sum--; } } while(sum==0) goto end;}end:printf("%d",j); return 0;}
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ // 请在此输入您的代码 int i; int sum=1; for(i=1;sum<2022;i++) { if(i%10==1){sum++;} //个位为1 if(i/100%10==1){sum++;} //百位 if(i/10%10==1){sum++;}//十位 if(i/1000==1){sum++;} //千位 } printf("%d",i-1); return 0;}
6、数字三角形路径最大和
![](http://zhangshiyu.com/zb_users/upload/2023/05/20230502180209168302172967481.png)
#include <stdio.h>#include <stdlib.h>//注意:题目中向左下走的次数与向右下走的次数相差不能超过 1,它是最后走的次数之间的差,//并不是每走一步的差。int max(int a,int b)//求最大值{ return a>b?a:b; }int main(int argc, char *argv[]){ int n,sum=0; int a[105][105],f[105][105];//a数组用描述题目,f数组用来存储和值 scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][j]);//输入数据 f[1][1]=a[1][1];//把开头第一个数直接给f数组 for(int i=2;i<=n;i++)//从第二行遍历开始 { for(int j=1;j<=i;j++) { if(j==1) f[i][j]=f[i-1][j]+a[i][j];//每行f数组开头的数就等于a数组本身加上上一行的第一个数 else if(i==j) f[i][j]=f[i-1][j-1]+a[i][j];//末尾的数和上一行相同 else f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];//重点,如果不是本身,则等于数组f的左上和右上的最大值加上数组a本身 } } //找规律发现如果n为奇数时,最后必然走到最后行最中间的数,如果为偶数,则取中间两个数的最大值, //因为向左下走的次数与向右下走的次数相差不能超过 1 if(n%2==1) printf("%d",f[n][n/2+1]);//奇数情况下 else printf("%d",max(f[n][n/2],f[n][n/2+1])); return 0;}
7、购物单总价钱
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ // 请在此输入您的代码 float a; int b; float sum=0; while(scanf("%f %d",&a,&b)!=EOF) { sum+=1.0*a*b/100; if(a==0&&b==0) break; } printf("%.2f",sum); // printf("5200"); return 0;}
EOF在scanf连用时代表-1的意思,当用到while(scanf()!=EOF),代表的意思是一直输入,直到scanf返回的值是-1时才会停止输入,也可以在while里面加上一些约束条件,使输入在特定的条件下就会停止,也可以在输入完成后按下Ctrl+z,可以强行停止输入
scanf这个函数是有一个返回值的, while(scanf("%d",&n)!=EOF) 当你在一直输入时,scanf不会返回-1,而当你通过某种方式,例如上面提到的ctrl+z停止输入后,scanf应该会返回-1,此时等价于EOF,那么这个循环就跳出停止
%.0f,表示不输出小数位,但要对第一位小数进行四舍五入%.1f,表示保留一位小数,对第二位小数进行四舍五入
8、256MB 的空间可以存储多少个 3232 位二进制整数?
1MB = 1024KB 1KB = 1024字节(byte) 1字节 = 8位(bits)%d 输出的是 int,
%ld 输出的是 long,
%lld 输出的是 long long;
int -2147483648~2147483647
long int -2147483648~2147483647
long long int -9223372036854775808~9223372036854775807
#include <stdio.h>int main(void){ // 1 MB = 1024 KB // 1 KB = 1024 Byte // 1 Byte = 8 bit long long count = 0; count = (256 * 1024 * 1024) / 4; printf("%lld",count); return 0;}
![](http://zhangshiyu.com/zb_users/upload/2023/05/20230502180209168302172990040.png)
9、成绩分析(最高分、最低分、平均分)
#include<stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ int n,scores[10000],max=0,min=100; float aver,num=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&scores[i]); num+=scores[i]; if(scores[i]>max) max = scores[i]; if(scores[i]<min) min = scores[i]; } aver=num/n; printf("%d\n",max); printf("%d\n",min); printf("%.2f",aver);}
10、逆向冒泡排序
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ //冒泡排序 对有N个字母的字符串时 完全乱序时 需要交换N*(N-1)/2次数 //即最少需要15个字母 //要求字典序最小 显然要取a-o这15个字典序最小的字母 /* 逆向思考 字符串经过100次交换后 得到正序字符串abcdefghijklmno 而完全乱序的字符串onmlkjihgfedcba变成正序字符串需要105次交换 则将完全乱序的字符串交换5次即为所求答案 而要求字典序最小 将j交换5次到字符串最前面 就得到了最小情况 */ printf("jonmlkihgfedcba"); return 0;}
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ int i,m,t,j; int n=0; while((n*n-n)/2<100){ //求最坏情况下的字符串长度 15 n=n+1; } m=(n*n-n)/2-100;//比起完全逆序,字符串可以比完全逆序少m次比较 5 int arr[n]; for(i=0;i<n;i++){ arr[i]=97+n-i-1;//arr[]为完全逆序字符串 } for(i=5;i>0;i--){ if(arr[i]<arr[i-1]){ t=arr[i]; arr[i]=arr[i-1]; arr[i-1]=t; } } for(i=0;i<n;i++){ printf("%c",arr[i]); } return 0;}
11、闰年平年
#include<stdio.h>int main(){ int year=2000,day[7]={6,7,1,2,3,4,5},month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},i,j=0,sum=0; for(;year<=2020;year++){ if(year%400==0||year%4==0&&year%100!=0)month[2]=29; //闰年,2月29天 //能被400整除,或者能被4整除且不能被100整除 else month[2]=28; //平年2月28天 for(int k=1;k<=12;k++){ for(i=1;i<=month[k];i++){ if(day[j%7]==1||i==1)sum++;//星期1且每月第一天 sum++; j++; if(year==2020&&k==10&&i==1){ printf("%d",sum); return 0;} } } }}
12、等差素数数列
#include <stdio.h>#include <stdlib.h> _Bool sushu(int b){ for(int a=2;a<b/2;a++) { if(b%a==0) { return 0; //不是素数 } } return 1;//是素数}int main(int argc, char *argv[]){ // 请在此输入您的代码 int biaozhi=0; for(int i=2;i<50000;i++) //枚举首项 if(sushu(i)) //当首项是素数时 接着寻找下一项 { for(int j=2;j<1000;j++) //枚举公差 { for(int t=0;t<10;t++) //找10个 { if(sushu(i+j*t)) //等差数列公式:a[i+1]=a[1]+(n-1)d { biaozhi++; } else{ biaozhi=0; break; } if(biaozhi==10) { printf("%d",j); return 0; } } } } return 0;}
13、能被n整除的数组成三位数出现的组合次数
//核心:通过判断三个数出现的组合次数。#include<stdio.h>typedef long long LL;int main(){ LL n =4; // i=1 1 4; 1 2 2; 1 3 不满足。i=2 不满足,退出循环 //LL n =6; // i=1 1 6; 1 2 3; 1 3 不满足 //LL n =9; //i=1 1 9; 1 2 不满足;1 3 3;1 4 不满足 //i每次都是从1开始,j每次都是从i开始,到根号n结束。因为当i=1时,j*j是满足条件的最后一种情况 //当i和j都能被整除是,k的值就是 n/i/j。 首先只需要求出能被整除的数的依次顺序,下一步在求组合数。 LL i,j,k; int res = 0; for(i = 1;i*i*i<=n;i++) //三个数相同i。i*i*i if(n% i == 0) //并且i能被整除 for(j = i;i*j*j<=n;j++) //此时从该数开始,找出后面相同的两个数j。i*j*j if(n/i%j == 0) //并且j能被整除 { k = n/i/j; if(i == j && i ==k) res++; //三个数相等,只有一个组合 else if(i == j || i == k || j == k) res += 3;//两个相等,3种组合 else res += 6;//三个不相同的数,有6中组合方式 } printf("%d",res);//输出最后的总的组合数 // printf("2430"); n=2021041820210418 return 0;}
14、连成一片的七段码数码管表达多少种不同的字符
回溯算法。 visit数组代表是否点亮。0表示灯不亮,用1表示灯亮。思路是一段的数量=该段自己亮+该段亮且连通分支的数量。 最后由于每种情况都被算了两遍,故而要除以2 #include <stdio.h>int BackTrack(int graph[][7],int visit[],int n,int i){ int count=1; for(int x=0;x<n;x++){ if(visit[x]==0&&graph[i][x]!=0){ visit[x]=1; count+=BackTrack(graph,visit,7,x); visit[x]=0; } } return count;}int main(){ int graph[7][7]={ {1,1,0,0,0,1,0}, {1,1,1,0,0,0,1}, {0,1,1,1,0,0,1}, {0,0,1,1,1,0,0}, {0,0,0,1,1,1,1}, {1,0,0,0,1,1,1}, {0,1,1,0,1,1,1} }; int visit[7]={0}; printf("%d",BackTrack(graph,visit,7,0)/2); return 0;}
15、分子和分母的最大公约数是 1的分数
#include <stdio.h>#include <stdlib.h>#include<stdio.h>int s(int a,int b){ if(a%b==0) return b; else return s(b,a%b);} int main(){ int sum=0; for(int i=1;i<=2020;i++){ for(int j=1;j<=2020;j++){ if(s(i,j)==1) sum++; } } printf("%d",sum); return 0;}
16、输入一行包含一个整数,表示时间
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ // 请在此输入您的代码 long long n; scanf("%lld",&n); n/=1000; //1s=1000ms int h=n/60/60%24; //除分秒%24小时上限 int m=n/60%60; //除秒%60分钟上限 int s=n%60; //同理 printf("%02d:%02d:%02d",h,m,s); //%02d,不足两位补0 //%2d,去掉0就默认不足两位补空格 return 0; }
17、数列求值
给定数列 1, 1, 1, 3, 5, 9, 17,⋯,从第 4项开始,每项都是前 3 项的和。求第 20190324项的最后 44 位数字。
#include <stdio.h>int main(void){ int a=1,b=1,c=1,d,i; for(i=4;i<=20190324;i++) { # a b c 每次往后传递循环 # a=b # b=c # c=a+b+c d=(a+b+c)%10000; a=b; b=c; c=d; } printf("%04d",d); # 前面有0就可以用%04d解决 return 0;}