练习5-1 求m到n之和
int sum( int m, int n ){
int temp=0;
for(int i=m;i<=n;i++){
temp +=i;
}
return temp;
}
练习5-2 找两个数中最大者
int max( int a, int b ){
return a>b?a:b;
}
练习5-3 字符金字塔
void CharPyramid( int n, char ch){
for(int i=0;i<n;i++){
for(int j=0;j<n-1-i;j++){
printf(" ");
}
for(int j=0;j<=i;j++){
printf("%c ",ch);
}
printf("\n");
}
}
习题5-1 符号函数
int sign( int x ){
if(x>0){
return 1;
}else{
return x==0?0:-1;
}
}
习题5-2 使用函数求奇数和
int even( int n ){
return n%2==0?1:0;
}
int OddSum( int List[], int N ){
int sum=0;
for(int i=0;i<N;i++){
if(!even(List[i]))sum+=List[i];
}
return sum;
}
习题5-3 使用函数计算两点间的距离
double dist( double x1, double y1, double x2, double y2 ){
return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}
习题5-4 使用函数求素数和
int prime( int p ){
if(p<2)return 0;
for(int i=2;i*i<=p;i++){
if(p%i==0){
return 0;
}
}
return 1;
}
int PrimeSum( int m, int n ){
int sum=0;
for(int i=m;i<=n;i++){
sum+=prime(i)==1?i:0;
}
return sum;
}
习题5-5 使用函数统计指定数字的个数
int CountDigit( int number, int digit ){
number=number<0?-number:number;
int cnt=0;
if(number==digit)return 1;
while(number!=0){
if(number%10==digit){
cnt++;
}
number /=10;
}
return cnt;
}
习题5-6 使用函数输出水仙花数
#include <math.h>
int narcissistic( int number ){
int cnt=0;
int temp1=number,temp2=number;
while(temp1!=0){//统计位数
cnt++;
temp1 /=10;
}
int sum=0;
while(temp2!=0){//计算每个位上的数字的N次幂之和
sum +=pow(temp2%10,cnt);
temp2 /=10;
}
return number==sum?1:0;
}
void PrintN( int m, int n ){
for(int i=m+1;i<n;i++){
if(narcissistic(i))printf("%d\n",i);
}
}
习题5-7 使用函数求余弦函数的近似值
double funcos( double e, double x ){
double temp=1.0,res=1.0;
for(int i=2;;i+=2){
temp *=(-1)*x*x/(i*(i-1));
res +=temp;
if(fabs(temp)<e)return res;//退出条件
}
}
习题5-8 空心的数字金字塔
#include <string.h>
void hollowPyramid( int n ){
if(n==1){//注意!
printf("1\n");
return;
}
char arr[20]={0};//定义一行字符串
//打印特殊第一行
memset(arr,0,sizeof(arr));
//前空格
int pos;
for(int j=0;j<n-1;j++){
arr[j]=' ';
pos=j;
}
//左数字
arr[pos+1]='0'+1;
printf("%s\n",arr);
//打印2~n-1行
for(int i=2;i<n;i++){
memset(arr,0,sizeof(arr));
//前空格
int pos;
for(int j=0;j<n-i;j++){
arr[j]=' ';
pos=j;
}
//左数字
arr[pos+1]='0'+i;
//中间空格
int pos2=0;
for(int j=0;j<i*2-3;j++){
arr[pos+2+j]=' ';
pos2=pos+2+j;
}
//右数字
arr[pos2+1]='0'+i;
//打印一行字符串
printf("%s\n",arr);
}
//打印特殊最后一行
memset(arr,0,sizeof(arr));
for(int i=0;i<n*2-1;i++){
arr[i]='0'+n;
}
printf("%s\n",arr);
}
习题6-1 分类统计字符个数
#include <ctype.h>
void StringCount( char s[] ){
int cntl=0,cntb=0,cntd=0,cnto=0;
for(int i=0;s[i]!='\0';i++){
if(isalpha(s[i])){
cntl++;
}else if(isspace(s[i])){
cntb++;
}else if(isdigit(s[i])){
cntd++;
}else{
cnto++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",cntl,cntb,cntd,cnto);
}
习题6-2 使用函数求特殊a串数列和
int fn( int a, int n ){
int res=a;
if(n==1)return res;
for(int i=0;i<n-1;i++){
a *=10;
res += a;
}
return res;
}
int SumA( int a, int n ){
int sum=0;
for(int i=1;i<=n;i++){
sum +=fn(a,i);
}
return sum;
}
习题6-3 使用函数输出指定范围内的完数
int factorsum( int number ){
int sum=0;
for(int i=1;i<number;i++){
if(number%i==0)sum +=i;
}
return sum;
}
void PrintPN( int m, int n ){
int flag=0;
for(int i=m;i<=n;i++){
if(factorsum(i) == i){
flag=1;
printf("%d = 1",i);
for(int j=2;j<i;j++){
if(i%j==0){
printf(" + %d",j);
}
}
printf("\n");
}
}
if(!flag)printf("No perfect number");
}
习题6-4 使用函数输出指定范围内的Fibonacci数
int dp[10000]={0};
int fib( int n ){//用递归超时,故改用动态规划记录子状态
dp[0]=0;
dp[1]=1;
for(int i=2;i<10000;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
void PrintFN( int m, int n) {
int flag=0;
int first=1;
for(int i=1;;i++){
if(fib(i)>n)break;
if(fib(i)>=m){
if(first){//第一个输出前无空格
printf("%d",fib(i));
first=0;
}else{
printf(" %d",fib(i));
}
flag=1;//有斐波那契数
}
}
if(!flag)printf("No Fibonacci number");
}
习题6-5 使用函数验证哥德巴赫猜想
int prime( int p ){
if(p<2)return 0;
for(int i=2;i*i<=p;i++){
if(p%i==0){
return 0;
}
}
return 1;
}
void Goldbach( int n ){
for(int i=2;n-i>0;i++){
if(prime(i)&&prime(n-i)){
printf("%d=%d+%d",n,i,n-i);
break;
}
}
}