第一篇:c語言典型問題處理方法小結
優秀文檔,精彩無限!
c語言典型問題處理方法小結
一、循環問題(1)、數論問題
1、求素數
for(i=2;i<=a;i++)
if(a%i==0)
第一個if判斷是否能被2,3,4??
break;
直到本身整除。
if(a==i)
第二個if判斷是否只能被本身整除。
printf(“yesn”);
else printf(“non”);素數概念:
對于某個整數a>1,如果它僅有平凡約數1和a,則我們稱a為素數(或質數)。整數 1 被稱為基數,它既不是質數也不是合數。整數 0 和所有負整數既不是素數,也不是合數。
2、求最大公約數和最小公倍數 a、if(a>b)
{
t=a;
a=b;
b=t;
}
for(i=a;i>=1;i--)
if(a%i==0&&b%i==0)
break;
printf(“largest common divisor:%dn”,i);
printf(“least common multiple:%dn”,(a*b)/is);b、輾轉相除法求解
a1=a;
b1=b;
while(a%b!=0)
{
t=a%b;
a=b;
b=t;
}
printf(“largest common divisor:%dnleast common
multiple:%d”,b,a1*b1/b);
3、求完數
一個數如果恰好等于它的因子之和,這個數就稱為“完數”。
例如:6的因子為1、2、3,而6=1+2+3,因此6是“完數”。
優質文檔,精彩無限!
優秀文檔,精彩無限!
for(a=1;a<=1000;a++)
{
s=0;
注意S=0所放的位置
for(i=1;i<=a;i++)
if(a%i==0)
{
s+=i;
if(s>=a)
break;
}
if(s==a)
printf(“%dt”,a);
}
4、分解質因數
將一個整數寫成幾個質因數的連乘積,如: 輸入36,則程序輸出36=2*2*3*3。解
一、main()看似簡單,但要自己完整地寫出來還真不{ 容易!!
int a,z,i;竟然還動用了goto語句,正好可以熟悉一
clrscr();下goto語句的用法!!
scanf(“%d”,&a);
loop: for(z=2;z<=a;z++)判斷下一個數開始有要重新 { 從2 for(i=2;i<=z;i++)判斷是否為質數 開始了。所以用loop語句回
if(z%i==0)到for語句,這是for語句仍
break;從2初始化。
if(z==i)從2開始的原則不變,變的判斷是否為a的質因數
if(a%z==0)是a的值。
{
k++;
用計數器來解決每行輸入不
if(k==1)
同的問題。
printf(“%d=%d”,a1,z);
else
printf(“*%d”,z);
a/=z;
goto loop;
} } } 解二: main(){
int n, k=2, isfirst=1;
printf(“Input n=”);
scanf(“%d”,&n);
優質文檔,精彩無限!
優秀文檔,精彩無限!
while(k<=n)
if(n%k==0)
{ if(isfirst){ printf(“%d=%d”, n, k);isfirst=0;}
else printf(“*%d”,k);
n/=k;
}
else k++;
printf(“n”);}
5、從鍵盤輸入兩個整數,輸出這兩個整數的商的小數點后所有1000位整數
for(i=1;i<=1000;i++)
主要體會除法運算中小數形成的原因
{
解決這類題目從本質出發
t=a%b;
printf(“%d”,t*10/b);
a=t*10;
}
printf(“n”);
6、編程計算并輸出兩個帶分數的差。帶分數就是由一個整數和一個真分數合成的數,兩個帶分數(整數、分子、分母均大于0)從鍵盤輸入,且帶分數1大于帶分數2,輸入格式為:整數1[分子1/分母1],整數2[分子2/分母2]。差要求化簡,整個輸出樣式為(如差為整數,則無分數部分,如差的整數為0,則無整數部分):
整數1[分子1/分母1]-整數2[分子2/分母2]=整數[分子/分母] 例如:輸入:12[6/35],8[3/5] 輸出:12[6/35]-8[3/5]=3[4/7] 又如:輸入:6[2/3],4[12/18]
輸出:6[2/3]-4[12/18]=2 又如:輸入:9[7/8],9[3/8]
輸出:9[7/8]-9[3/8]=[1/2]
main(){
int z1,fz1,fm1,fz1x,z2,fz2,fm2,fz2x,z,fz,fm,fzx,i;
scanf(“%d[%d/%d],%d[%d/%d]”,&z1,&fz1,&fm1,&z2,&fz2,&fm2);
fz1x=z1*fm1+fz1;
fz2x=z2*fm2+fz2;
fm=fm1*fm2;
fz=fz1x*fm2-fz2x*fm1;
優質文檔,精彩無限!
優秀文檔,精彩無限!
for(i=fm;i>=2;i--)
if(fm%i==0&&fz%i==0)
{
fz/=i;
fm/=i;
}
z=fz/fm;
fzx=fz%fm;
if(fzx==0)
printf(“%d[%d/%d]-%d[%d/%d]=%dn”,z1,fz1,fm1,z2,fz2,fm2,z);
else if(z==0)
printf(“%d[%d/%d]-%d[%d/%d]=[%d/%d]n”,z1,fz1,fm1,z2,fz2,fm2,fzx,fm);
else
printf(“%d[%d/%d]-%d[%d/%d]=%d[%d/%d]n”,z1,fz1,fm1,z2,fz2,fm2,z,fzx,fm);}
(2)近似問題
1、書P122習題4-6 #include “math.h”
注意千萬不要忘記添加 main()
#include “math.h” {
float x,j=1,k,s,so;
int n;
scanf(“%f”,&x);
s=x;
so=x+1;
for(n=1;fabs(s-so)>1e-6;n++)
{
for(k=1;k<=n;k++)
j*=k;
so=s;
if(n%2!=0)
s-=x*x*x/((2*n-1)*j);
else
s+=x*x*x/((2*n-1)*j);
}
printf(“%fn”,s);
2、解方程問題:
編程用二分法求解方程x3+4x2-10=0的解。#include “math.h” main()
優質文檔,精彩無限!
優秀文檔,精彩無限!
{
float x,x1=1,x2=4,f1=-1,f;
/*f1=x1*x1*x1+4*x1*x1-10;*/ 可以省略此句
while(fabs(x2-x1)>1e-6)
{
x=(x1+x2)/2;
f=x*x*x+4*x*x-10;
if(f>0)
x2=x;
else
x1=x;
}
printf(“%fn”,x);}(3)枚舉法(4)數列問題
二、數組問題(1)排序問題
1、從小到大排序 main(){ int a[10],i,j,t;for(i=0;i<10;i++)scanf(“%d”,&a[i]);
for(i=1;i<10;i++)
for(j=0;j<10-i;j++)
if(a[j]>a[j+1])
{ t=a[j+1];a[j+1]=a[j];a[j]=t;
} for(i=0;i<10;i++)printf(“%d ”,a[i]);printf(“n”);}
2、從大到小排序 main(){ int a[10],i,j,t;for(i=0;i<10;i++)
scanf(“%d”,&a[i]);for(i=1;i<10;i++)
for(j=9;j>=i;j--)
可以用/*if(f*f1<0)*/替代
注意排序問題:
1、須迅速,熟練,無差錯 經常插入在程序中間
2、現使用最大數下沉冒泡法 還可以使用最小數上浮冒泡法
3、j控制前面一個數和后面一個數一一比較。由于是最大數下沉,i+1后j仍要從0開始。
4、i控制這樣的操作一共要做多少次
5、注意i j的控制次數
現使用最大數上浮冒泡法 還可使用最小數下沉冒泡法
優質文檔,精彩無限!
優秀文檔,精彩無限!
if(a[j]>a[j-1])
{
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
} for(i=0;i<10;i++)printf(“%d ”,a[i]);}(2)二維數組
三、字符或字符串輸入輸出問題(1)字符打印
1、打印* 此類題的溯源為書P122 4.11(1),其他題都是它的拓展
a、* ** *** ****
解題要點:
此類題關鍵在于找到每行要打印的個數和行數的關系。此題j==i b、**** *** j==n-i+1 ** *
for(i=1;i<=n;i++)
一共要輸出的行數
{
for(j=1;j<=i;j++)
每行要打印的*數
printf(“*”);
printf(“n”);
}
c、for(i=1;i<=n;i++)
一共要輸出的行數
{
*
for(j=1;j<=n-i;j++)
控制空格數
**
printf(“ ”);***
for(k=1;k<=i;k++)
每行要打印的*數 ****
printf(“*”);解題要點:
printf(“n”);在出現空格的時候,在找到每行要打印的‘*’個數和行數的關系后,還應找到
} 空格和行數的關系,分不同的參數進行循環。此題k==i j==n-i d、j==i-1 k==n-i+1
優質文檔,精彩無限!
優秀文檔,精彩無限!
**** ***
**
for(i=1;i<=n;i++)
*
{ e、for(j=1;j<=n-i;j++)
*
printf(“ ”);
*** *****
for(k=1;k<=2*i-1;k++)*******
printf(“*”);
printf(“n”);
}
*
for(i=1;i<=n;i++)
***
{ *****
for(j=1;j<=n-i;j++)*******
printf(“ ”);*****
for(k=1;k<=2*i-1;k++)
***
printf(“*”);
*
printf(“n”);
}
2、打印9*9乘法表
解題要點:注意尋找行與列的規律。i*j i代表列 j代表行
3、九九乘法表 1 2
3
… …
4、楊暉三角形 1 1 1 1 1 1 10 5 1 20 15 6(2)字符串打印問題
優質文檔,精彩無限!
for(i=1;i<=n-1;i++){ for(j=1;j<=i;j++)printf(“ ”);for(k=1;k<=2*(n-1-i)+1;k++)printf(“*”);printf(“n”);} for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
printf(“%-3d ”,i*j);
printf(“n”);
} 注意輸出格
式的控制
1、A B C D E Z Z A B C D E
E Z A B C D
D E Z A B C
C D E Z A B
B C D E Z A
gets(a);for(i=1;i<=7;i++)puts(a);
{ 優秀文檔,精彩無限!for(i=1;i<=5;i++)
a[i][1]=1;
{
a[i][i]=1;
t=a[5];
}
for(j=5;j>0;j--)
for(i=3;i<=7;i++)
a[j]=a[j-1];
for(j=2;j<=i-1;j++)
a[0]=t;
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(k=0;k<=5;k++)
注意交換過程和
printf(“%c”,a[k]);
把所有的數后移
printf(“n”);
}
2、輸入一字符串小寫換大寫
char a[81];
int i;
gets(a);
for(i=0;a[i]!=' 主站蜘蛛池模板: 特大巨黑吊av在线播放| 国产成人无码国产亚洲| 国产又爽又黄无码无遮挡在线观看| 亚洲欧美国产毛片在线| 又粗又猛又黄又爽无遮挡| 狠狠亚洲婷婷综合色香五月排名| 免费久久人人香蕉av| 久久99日韩国产精品久久99| 天堂а√中文在线官网| 全免费a级毛片免费看无码| 久久精品免费观看国产| 免费看撕开奶罩揉吮奶头视频| 日韩精品无码免费专区网站| 无码高清 日韩 丝袜 av| 国产精品亚洲а∨怡红院| 99爱国产精品免费高清在线| 欧美做受三级级视频播放| 亚洲人成伊人成综合网76| 欧洲亚洲国产成人综合色婷婷| 国产偷窥熟女精品视频| 国产精品午夜福利在线观看地址| 精品国产乱码久久久久夜深人妻| 337p粉嫩日本欧洲亚洲大胆| 亚洲日本高清成人aⅴ片| 亚洲精品无码成人a片| 日本亚洲欧美国产日韩ay| 欧美 日韩 亚洲 精品二区| 亚洲精品综合一区二区| 欧美最爽乱婬视频免费看| 浴室人妻的情欲hd三级| 男女猛烈激情xx00免费视频| 国产公开免费人成视频| 久久人人爽人人爽人人爽| 同性男男黄g片免费网站| 2021久久天天躁狠狠躁夜夜| 久久成人亚洲香蕉草草| 久久99久久99精品免视看动漫| 亚洲成a人片在线观看中文无码| 天天爽天天爽夜夜爽毛片| 欧美 日韩 国产 另类 图片区| 精东天美麻豆果冻传媒mv|