一.统计(计数)问题:
方法:计数变量c的初值为0,每输入一个数据,进行必要判断后,若输入的数据满足统计条件,则计数变量c自加1,这样当对所有输入进行判断后,计数变量c的值就是统计的结果。
例1:输入若干非0实数,直到输入0为止,要求输入的实数最多不超过20个,统计其中正数的个数,负数的个数
#include<stdio.h>
int main()
{
int n,posn,negn;double a;
n = posn = 0;
printf("Input real numbers:\n");
while(1)
{
scanf("%lf",&a);
if(a==0)break;
if(a>0)posn++;
n++;
if(n>=20)break;
}
negn = n-posn;
printf("posn = %d,negn = %d\n",posn,negn);
}
例2:输入一行字符,统计其中的英文字母的个数。
提示:即输入若干字符,直到输入‘\n’时停止输入
#include<stdio.h>
int main()
{
char ch;int n=0;
printf("请输入一行字符:\n");
while((ch = getchar())!='\n')
{
if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')n++;
}
printf("输入的英文字符有%d个\n",n);
return 0;
}
二.求最大值与最小值
方法:设置最大(小)值变量max(min),其初值为其数据类型能够表示的最小(大)值,或者一个比待选数据集合中所有数据都小(大)的值,或者待选数据集合中的任一个数据。
将待选数据集合中的每一个数据与max(min)比较,若大于max(小于min),则该数据存入max(min)直到所有数据比较结束。
例1:输入若干long型非0整数,直到输入0时停止,求输入的非0整数中的最大值。
#include<stdio.h>
int main()
{
long a,max = -2147483648;
printf("input long integers until input 0:\n");
while(1)
{
scanf("%ld",&a);
if(a==0)break;
if(a>max)max = a;
}
printf("max = %ld\n",max);
}
三.递推迭代
如果直接使用通项公式计算可能会有通项公式不存在,通项公式比较复杂算法效率低等局限性。
例1:利用下面的公式计算π的近似值,要就计算到最后一项的绝对值小于10^-6时停止计算。
π/4 ≈ 1 - 1/3 + 1/5 - 1/7 + …
#include<stdio.h>
int main()
{
double a,pi;
int i,s;
a = 1.0;pi = 0;
s = 1;
i = 1;
while(a>1e-6)
{
pi+=s*a;
i+=2;
a = 1.0/i;
s = -s;
}
pi = pi*4;
printf("pi = %f\n",pi);
return 0 ;
}
例2:输入m,n值,计算组合数p = C(n,m)
#include<stdio.h>
void main()
{
double p = 1.0;
int m,n,k;
printf("input n,m:");
scanf("%d%d",&n,&m);
if(n<0||m<0||m>n){
printf("输入的数据不正确!\n");
return;
}
if(m>n-m)m = n-m;
for(k = 1;k<=m;k++){
p = p*(n-m+k)/k;
}
printf("C(%d,%d)=%.0f\n",n,m,p);
}
例3:编程打印斐波那契数列的前40项,要求每行输出4个数,共10行。
#include<stdio.h>
int main()
{
long f1,f2;int k;
f1 = f2 = 1;
printf("%10ld%10ld",f1,f2);
for(k = 3;k<=40;k++){
f2 = f1+f2;
f1 = f2-f1;
printf("%10ld",f2);
if(k%4==0)printf("\n");
}
return 0;
}
例4:输入一行表示16进制数的字符串,转换为长整形数后,以十六进制的形式输出
#include<stdio.h>
int main()
{
long y = 0;int x = 16,a;char c;
printf("input a HEX integer:");
while(1)
{
c = getchar();
if(c==0)break;
if(c>='0'&&c<='9')a=c-48;
else if(c>='A'&&c<='F')a = c-55;
else if(c>='a'&&c<='z')a = c-87;
else break;
y = y*x+a;
}
printf("y = %lX\n",y);
}
四.字符图形
#include<stdio.h>
int main()
{
int n,i,j;
printf("input n = ");
scanf("%d",&n);
for(i = 0;i<=n;i++)
{
for(j = 1;j<=n-i;j++)putchar(32);
for(j = 1;j<=i;j++)putchar('*');
printf("\n");
}
}
五.搜索穷举
例1水仙花数的求解
#include<stdio.h>
int main()
{
printf("输出水仙花数:\n");
int i, a, b, c;
for (i = 100; i <= 999; i++) //整数的取值范围
{
int a = i % 10;//个位数
int b = (i / 10) % 10;//十位数
int c = i / 100;//百位数
if (i == a * a * a + b * b * b + c * c * c) //各位上的立方和是否与原数n相等
printf("%d\t", i);
}
return 0;
}