C语言经典算法 11-20
十一、求最大公约数和最小公倍数
题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
程序分析:利用辗除法。
代码如下:
#include<stdio.h>
int main(void)
{
int a,b;
int m,n;//m存放最大公约数n存放最小公共倍数
int temp=0;
int i=0;
scanf("%d %d",&a,&b);
n=a*b;
if(a>=b)
{
temp=a%b;
while(temp)
{
a=b;
b=temp;
temp=a%b;
}
m=b;//最大公约数
}
else
{
temp=b%a;
while(temp)
{
b=a;
a=temp;
temp=b%a;
}
m=a;//最大公约数
}
n=n/m;//最小公倍数
printf("%d %d\n",m,n);
return 0;
}
十二、统计字符串数字,字母,符号的各个数量
题目:输入一行字符,分别统计出其中英文字母、数字和其它字符的个数。
代码如下:
#include<stdio.h>
#include<string.h>
int main(void)
{
int i;
int word=0;//统计字母数
int number=0;//统计数字数
int fuhao=0;//统计符号数
char a[200];
scanf("%s",a);
for(i=0;i<strlen(a);i++)
{
if( ( a[i]>='a' && a[i]<='z' ) || ( a[i]>='A' && a[i]<='Z' ))
{
word++;
continue;
}
if(a[i]>='0'&&a[i]<='9')
{
number++;
continue;
}
fuhao++;
}
printf("字符串总长度为:%d\n",strlen(a));
printf("共有%d个字母\n",word);
printf("共有%d个数字\n",number);
printf("共有%d个符号\n",fuhao);
return 0;
}
十三、2+22+222+…
题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。
例如 2+22+222+2222+22222(此时 共有 5 个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值。
代码如下:
方法一:
#include<stdio.h>
void main()
{
int a,n,count=1;
long int sn=0,tn=0;
printf("please inputaand n\n");
scanf("%d,%d",&a,&n);
printf("a=%d,n=%d\n",a,n);
while(count<=n)
{
tn=tn+a;
sn=sn+tn;
a=a*10;
++count;
}
printf("a+aa+...=%ld\n",sn);
方法二:
#include<stdio.h>
int main(void)
{
int a,n;
int sum=0;
int b=0;
int i=0;
printf("请输入a的值:");
scanf("%d",&a);
printf("请输入n的值:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
b=b*10;
b=b+a;
sum=sum+b;
}
printf("%d\n",sum);
return 0;
}
十四、完数
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如 6=1+2+3.
编程 找出 1000 以内的所有完数。
程序分析:何判断素数有点像,不过它是要把因子加一块
代码如下:
#include<stdio.h>
void main()
{
int i,j,k;
for(i=1;i<=1000;i++)
{
k=0;
for(j=1;j<=i-1;j++)
if(i%j==0)
k+=j;
if(k==i)
printf("%d\n",i);
}
}
十五、小球反弹问题
题目:一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,
求它在 第 10次落地时,共经过多少米?第 10 次反弹多高?
代码如下:
#include<stdio.h>
void main()
{
float sn=100.0,hn=sn/2;
int n;
for(n=2;n<=10;n++)
{
sn=sn+2*hn;/*第 n 次落地时共经过的米数*/
hn=hn/2;/*第 n 次反跳高度*/
}
printf("thetotalof road is %f\n",sn);
printf("thetenthis %fmeter\n",hn);
}
十六、猴子吃桃问题
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。
到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
代码如下:
#include<stdio.h>
void main()
{
int day,x1,x2;
day=9; x2=1;
while(day>0)
{
x1=(x2+1)*2;/*第一天的桃子数是第 2 天桃子数加 1 后的 2 倍*/
x2=x1;
day--;
}
printf("thetotalis %d\n",x1);
}
十七、求一个分数序列的和
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...
求出这个数列的前 20 项之和。
程序分析:请抓住分子与分母的变化规律。
代码如下:
#include<stdio.h>
void main()
{
int n,t,number=20;
float a=2,b=1,s=0;
for(n=1;n<=number;n++)
{
s=s+a/b;
t=a;
a=a+b;
b=t;/*这部分是程序的关键*/
}
printf("sum is %9.6f\n",s);
}
十八、求 1+2!+3!+…+20!的和
题目:求 1+2!+3!+...+20!的和
程序分析:先累乘再累加
代码如下:
#include<stdio.h>
void main()
{
float n,s=0,t=1;
for(n=1;n<=20;n++)
{
t*=n;
s+=t;
}
printf("1+2!+3!...+20!=%e\n",s);
}
十九、给你一个多位数 输出每一位数
题目:给一个不多于 5 位的正整数,要求:一、求它是几位数,
二、逆序打印出各位数字。
程序分析:学会分解出每一位数。
代码如下:
#include<stdio.h>
void main( )
{
long a,b,c,d,e,x;
scanf("%ld",&x);
a=x/10000;/*分解出万位*/
b=x%10000/1000;/*分解出千位*/
c=x%1000/100;/*分解出百位*/
d=x%100/10;/*分解出十位*/
e=x%10;/*分解出个位*/
if(a!=0)
printf("thereare5, %ld %ld %ld %ld %ld\n",e,d,c,b,a);
else if (b!=0)
printf("there are 4,%ld %ld %ld %ld\n",e,d,c,b);
else if (c!=0)
printf(" thereare3,%ld %ld %ld\n",e,d,c);
else if (d!=0)
printf("there are 2,%ld %ld\n",e,d);
else if (e!=0)
printf(" thereare1,%ld\n",e);
}
二十、回文数
题目:一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。
代码如下:
#include<stdio.h>
void main( )
{
long ge,shi,qian,wan,x;
scanf("%ld",&x);
wan=x/10000;
qian=x%10000/1000;
shi=x%100/10;
ge=x%10;
if(ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/
printf("this number is ahuiwen\n");
else
printf("this number is not ahuiwen\n");
}