第一篇:c語言典型問題處理方法小結(jié)
優(yōu)秀文檔,精彩無限!
c語言典型問題處理方法小結(jié)
一、循環(huán)問題(1)、數(shù)論問題
1、求素數(shù)
for(i=2;i<=a;i++)
if(a%i==0)
第一個if判斷是否能被2,3,4??
break;
直到本身整除。
if(a==i)
第二個if判斷是否只能被本身整除。
printf(“yesn”);
else printf(“non”);素數(shù)概念:
對于某個整數(shù)a>1,如果它僅有平凡約數(shù)1和a,則我們稱a為素數(shù)(或質(zhì)數(shù))。整數(shù) 1 被稱為基數(shù),它既不是質(zhì)數(shù)也不是合數(shù)。整數(shù) 0 和所有負整數(shù)既不是素數(shù),也不是合數(shù)。
2、求最大公約數(shù)和最小公倍數(shù) 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(“l(fā)argest common divisor:%dn”,i);
printf(“l(fā)east common multiple:%dn”,(a*b)/is);b、輾轉(zhuǎn)相除法求解
a1=a;
b1=b;
while(a%b!=0)
{
t=a%b;
a=b;
b=t;
}
printf(“l(fā)argest common divisor:%dnleast common
multiple:%d”,b,a1*b1/b);
3、求完數(shù)
一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”。
例如:6的因子為1、2、3,而6=1+2+3,因此6是“完數(shù)”。
優(yōu)質(zhì)文檔,精彩無限!
優(yōu)秀文檔,精彩無限!
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、分解質(zhì)因數(shù)
將一個整數(shù)寫成幾個質(zhì)因數(shù)的連乘積,如: 輸入36,則程序輸出36=2*2*3*3。解
一、main()看似簡單,但要自己完整地寫出來還真不{ 容易??!
int a,z,i;竟然還動用了goto語句,正好可以熟悉一
clrscr();下goto語句的用法?。?/p>
scanf(“%d”,&a);
loop: for(z=2;z<=a;z++)判斷下一個數(shù)開始有要重新 { 從2 for(i=2;i<=z;i++)判斷是否為質(zhì)數(shù) 開始了。所以用loop語句回
if(z%i==0)到for語句,這是for語句仍
break;從2初始化。
if(z==i)從2開始的原則不變,變的判斷是否為a的質(zhì)因數(shù)
if(a%z==0)是a的值。
{
k++;
用計數(shù)器來解決每行輸入不
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);
優(yōu)質(zhì)文檔,精彩無限!
優(yōu)秀文檔,精彩無限!
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、從鍵盤輸入兩個整數(shù),輸出這兩個整數(shù)的商的小數(shù)點后所有1000位整數(shù)
for(i=1;i<=1000;i++)
主要體會除法運算中小數(shù)形成的原因
{
解決這類題目從本質(zhì)出發(fā)
t=a%b;
printf(“%d”,t*10/b);
a=t*10;
}
printf(“n”);
6、編程計算并輸出兩個帶分數(shù)的差。帶分數(shù)就是由一個整數(shù)和一個真分數(shù)合成的數(shù),兩個帶分數(shù)(整數(shù)、分子、分母均大于0)從鍵盤輸入,且?guī)Х謹?shù)1大于帶分數(shù)2,輸入格式為:整數(shù)1[分子1/分母1],整數(shù)2[分子2/分母2]。差要求化簡,整個輸出樣式為(如差為整數(shù),則無分數(shù)部分,如差的整數(shù)為0,則無整數(shù)部分):
整數(shù)1[分子1/分母1]-整數(shù)2[分子2/分母2]=整數(shù)[分子/分母] 例如:輸入: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;
優(yōu)質(zhì)文檔,精彩無限!
優(yōu)秀文檔,精彩無限!
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習(xí)題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()
優(yōu)質(zhì)文檔,精彩無限!
優(yōu)秀文檔,精彩無限!
{
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)數(shù)列問題
二、數(shù)組問題(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、須迅速,熟練,無差錯 經(jīng)常插入在程序中間
2、現(xiàn)使用最大數(shù)下沉冒泡法 還可以使用最小數(shù)上浮冒泡法
3、j控制前面一個數(shù)和后面一個數(shù)一一比較。由于是最大數(shù)下沉,i+1后j仍要從0開始。
4、i控制這樣的操作一共要做多少次
5、注意i j的控制次數(shù)
現(xiàn)使用最大數(shù)上浮冒泡法 還可使用最小數(shù)下沉冒泡法
優(yōu)質(zhì)文檔,精彩無限!
優(yōu)秀文檔,精彩無限!
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)二維數(shù)組
三、字符或字符串輸入輸出問題(1)字符打印
1、打印* 此類題的溯源為書P122 4.11(1),其他題都是它的拓展
a、* ** *** ****
解題要點:
此類題關(guān)鍵在于找到每行要打印的個數(shù)和行數(shù)的關(guān)系。此題j==i b、**** *** j==n-i+1 ** *
for(i=1;i<=n;i++)
一共要輸出的行數(shù)
{
for(j=1;j<=i;j++)
每行要打印的*數(shù)
printf(“*”);
printf(“n”);
}
c、for(i=1;i<=n;i++)
一共要輸出的行數(shù)
{
*
for(j=1;j<=n-i;j++)
控制空格數(shù)
**
printf(“ ”);***
for(k=1;k<=i;k++)
每行要打印的*數(shù) ****
printf(“*”);解題要點:
printf(“n”);在出現(xiàn)空格的時候,在找到每行要打印的‘*’個數(shù)和行數(shù)的關(guān)系后,還應(yīng)找到
} 空格和行數(shù)的關(guān)系,分不同的參數(shù)進行循環(huán)。此題k==i j==n-i d、j==i-1 k==n-i+1
優(yōu)質(zhì)文檔,精彩無限!
優(yōu)秀文檔,精彩無限!
**** ***
**
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乘法表
解題要點:注意尋找行與列的規(guī)律。i*j i代表列 j代表行
3、九九乘法表 1 2
3
… …
4、楊暉三角形 1 1 1 1 1 1 10 5 1 20 15 6(2)字符串打印問題
優(yōu)質(zhì)文檔,精彩無限!
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);
{ 優(yōu)秀文檔,精彩無限!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]);
把所有的數(shù)后移
printf(“n”);
}
2、輸入一字符串小寫換大寫
char a[81];
int i;
gets(a);
for(i=0;a[i]!='