?一顆斯特拉
【注】
1.標(biāo)有??的是值得多做的題目
- 題目來(lái)源于C語(yǔ)言經(jīng)典例題(菜鳥教程100例)
3.《學(xué)習(xí)日記 | C語(yǔ)言經(jīng)典例題③(實(shí)例41-60)》中題目比較偏,暫不更。
——3.3更新——
實(shí)例81:【求未知數(shù)】??II
題目:
,其中??代表的兩位數(shù),
為四位數(shù),
的結(jié)果為兩位數(shù),
的結(jié)果為3位數(shù)。求??代表的兩位數(shù),及
后的結(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ù)為=
③ 當(dāng)該數(shù)為三位數(shù)時(shí),奇數(shù)個(gè)數(shù)為=
……
⑧ 當(dāng)該數(shù)為八位數(shù)時(shí),奇數(shù)個(gè)數(shù)為=
找到規(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ú)


