©一颗斯特拉
【注】
1.标有❤️的是值得多做的题目
- 题目来源于C语言经典例题(菜鸟教程100例)
3.《学习日记 | C语言经典例题③(实例41-60)》中题目比较偏,暂不更。
——3.3更新——
实例81:【求未知数】❤️II
题目:,其中??代表的两位数,为四位数,的结果为两位数,的结果为3位数。求??代表的两位数,及后的结果。
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
②当该数为二位数时,奇数个数为=
③ 当该数为三位数时,奇数个数为=
……
⑧ 当该数为八位数时,奇数个数为=
找到规律后,我们再编写程序。
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;
}
【运行结果】
【缺陷】
考虑复杂了,这里用数组意义不大。题目比较简单,出现了输入的限制,最好写上例外。
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)输出输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。样例输入:
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;
}
【运行结果】
04题目总结:
暂无