目录
【程序18】求s=a+aa+aaa+aaaa+aa...a的值
【程序11】(古典问题)兔子问题。
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....
#include<bits/stdc++.h>
using namespace std;
int main()
{
int f1=1,f2=1,t;
printf("1 1 ");
for(int i=1;i<=20;i++)
{
t = f1 + f2;
f1= f2;
f2= t ;
printf("%d ",t);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int fib(int i)
{
if(i==1||i==2)return 1;
else return fib(i-1)+fib(i-2);
}
int main()
{
for(int i=1;i<=20;i++)
{
printf("%d ",fib(i));
}
return 0;
}
【程序12】判断101到200之间的素数。
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,leap=1;
for(i=101;i<=200;i++)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
leap = 0;
break;
}
}
if(leap==1)printf("%d ",i);
leap=1;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n)
{
for(int i=2;i<n;i++)
{
if(n%i==0)
{
return false;
break;
}
}
return true;
}
int main()
{
int i;
for(i=101;i<=200;i++)
{
if(isPrime(i))
printf("%d ",i);
}
return 0;
}
【程序13】打印出所有的“水仙花数”。
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数
本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,k;
for(n=100;n<=999;n++)
{
i=n/100;
j=n/10%10;
k=n%10;
if(i*i*i+j*j*j+k*k*k==n)printf("%d ",n);
}
return 0;
}
【程序14】将一个正整数分解质因数。
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=2;i<=n;i++)
{
while(n)
{
if(n%i==0)
{
printf("%d ",i);
n=n/i;
}
else break;
}
}
}
return 0;
}
【程序15】利用条件运算符的嵌套完成学习成绩的转换。
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,
60分以下的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int score;
char grade;
while(~scanf("%d",&score))
if(grade=score>=90?'A':(score>=60?'B':'C'))
printf("score %d belong to %c",score,grade);
return 0;
}
【程序16】求最大公约数和最小公倍数。
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
m=21,n=9
最大公约数:m%n 取余数(21%9=3)
把n的值赋给m,m=9,把余数的值赋给n,n=3(m%n=9%3==0)
最大公约数:3
最小公倍数:63
最大公约数*最小公倍数=m*n
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,temp,num1,num2;
scanf("%d%d",&num1,&num2);
if(num2>num1)
{
temp = num1;
num1 = num2;
num2 = temp;
}
a=num1,b=num2;
while(b!=0)
{
temp = a%b;
a = b;
b = temp;
}
printf("zuidayue:%d\n",a);
printf("zuixiao:%d",num1*num2/a);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,res,temp,num1,num2;
scanf("%d%d",&num1,&num2);
if(num2>num1)
{
temp = num1;
num1 = num2;
num2 = temp;
}
for(int i=1;i<=num2;i++)
{
if(num1%i==0&&num2%i==0)
res = i;
}
printf("zuidayue:%d\n",res);
printf("zuixiao:%d",num1*num2/res);
return 0;
}
2.扩大倍数法
12 8的最大公约数,扩大12,变成24能整除8,24为最小公倍数
12 24
8 16 24
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,n,ans,temp,num1,num2;
scanf("%d%d",&num1,&num2);
if(num2>num1)
{
temp = num1;
num1 = num2;
num2 = temp;
}
for(int i=1;i<=n;i++)
if(num1%i==0&&num2%i==0)
ans=i;//求最大公因数
for(i=1;(num1*i)%num2!=0;i++);//i代表扩大的倍数
printf("zuidayue:%d\n",ans);
printf("zuixiao:%d",num1*i);
return 0;
}
【程序17】输入一行字符,分别统计出其中英文字母的个数。
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
#include<bits/stdc++.h>
using namespace std;
int main()
{
char c;
int letters=0,space=0,digtal=0,others=0;
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
letters++;
else if(c==' ')
space++;
else if(c>='0'&&c<='9')
digtal++;
else others++;
}
printf("letters=%d,space=%d,digtal=%d,others=%d",letters,space,digtal,others);
return 0;
}
【程序18】求s=a+aa+aaa+aaaa+aa...a的值
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,n,sum=0,s=0;//n位数
scanf("%d%d",&a,&n);
for(int i=1;i<=n;i++)
{
s = s*10+a;
sum+=s;
}
printf("%d",sum);
}

【程序19】完数。
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
找出1000以内的所有完数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,sum,i;
for(n=1;n<1000;n++)
{
sum=0;
for(i=1;i<n;i++)
{
if(n%i==0)sum+=i;
}
if(sum==n)
{
printf("%d\n",n);
for(int i=1;i<n;i++)
{
if(n%i==0)printf("%d ",i);
}
printf("\n");
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
static int k[10];
int i,j,n,s;
for(i=1;i<1000;i++)
{
n=-1;//初始下标
s=i;//复制这个数
for(j=1;j<i;j++)
{
if((i%j)==0)
{
s-=j;
n++;
k[n]=j;
}
}
if(s==0)//当s为0,代表这个数是完全数
{
printf("%d\n",i);
for(j=0;j<n;j++)
printf("%d ",k[j]);
printf("\n");
}
}
return 0;
}
【程序20】小球自由下落。
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
第10次落地时,共经过多少米?第10次反弹多高?
#include<bits/stdc++.h>
using namespace std;
int main()
{
float s=100.0,h=s/2;
for(int i=2;i<=10;i++)
{
s=s+h*2;//第一次落地100,从第二次开始落地累加之前的距离加反弹和下落
h=h/2;
}
printf("the total of road is %f\n",s);
printf("the tenth is %f meter\n",h);
}
本博客资料、代码来源于C语言经典100例,本博客仅用于个人学习,可能存在纰漏,敬请批评指正。