// 输出:空心的数字金字塔
void hollowPyramid(int n){
// 边界处理
if(n==1){
printf("1");
return;
}else if(n==2){
printf(" 1\n");
printf("222");
return;
}
// 第1层
for(int i=1;i<=n-1;++i){
printf(" ");
}
printf("1\n");
// 第2-(n-1)层
for(int i=2;i<=n-1;++i){ // 第i层
for(int j=1;j<=n-i;++j){
printf(" ");
}
printf("%d",i);
for(int j=1;j<=2*i-3;++j){
printf(" ");
}
printf("%d\n",i);
}
// 第n层
for(int i=1;i<=2*n-1;++i){
printf("%d",n);
}
// 返回
}
#include <string.h>
// 输出:分类统计字符个数
void StringCount(char s[]){
int letter=0;
int blank=0;
int digit=0;
int other=0;
int sLen=strlen(s);
for(int i=0;i<sLen;++i){
if(s[i]>='a' && s[i]<='z'){
++letter;
}else if(s[i]>='A' && s[i]<='Z'){
++letter;
}else if(s[i]==' ' || s[i]=='\n'){
++blank;
}else if(s[i]>='0' && s[i]<='9'){
++digit;
}else{
++other;
}
}
// 输出
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
// 返回
return;
}
// 返回:n个a组成的数字
int fn(int a, int n){
// 结果
int result=0;
// 计算n个a组成的数字
for(int i=0;i<n;++i){
result*=10;
result+=a;
}
// 返回结果
return result;
}
// 返回:要求的和
int SumA( int a, int n ){
// 结果
int result=0;
// 计算特殊a串数列和
for(int i=1;i<=n;++i){
result+=fn(a,i);
}
// 返回结果
return result;
}
#include <stdbool.h>
// 返回:整数除自身外因子和
int factorsum(int number){
// 结果
int result=0;
// 计算整数除自身外因子和
int limit=number/2;
for(int i=1;i<=limit;++i){
if(number%i==0){
result+=i;
}
}
// 返回结果
return result;
}
// 输出:指定范围内的完数的因子累加形式的分解式
void PrintPN(int m,int n){
// 输出
bool isFound=false;
for(int i=m;i<=n;++i){
if(factorsum(i)==i){
isFound=true;
printf("%d = 1",i);
int limit=i/2;
for(int j=2;j<=limit;++j){
if(i%j==0){
printf(" + %d",j);
}
}
printf("\n");
}
}
if(!isFound){
printf("No perfect number\n");
}
// 返回
return;
}
// 返回:第n项fib数
int fib(int n){
// 边界处理
if(n<=0){
return 0;
}else if(n==1 || n==2){
return 1;
}
// 结果 nums[2]
int nums[3]={0,1,1};
// 滚动更新
for(int i=2;i<n;++i){
nums[0]=nums[1];
nums[1]=nums[2];
nums[2]=nums[0]+nums[1];
}
// 返回结果
return nums[2];
}
// 输出:闭区间[m,n]内所有fib数
void PrintFN(int m, int n){
// 输出
int cnt=0;
for(int i=0;fib(i)<=n;++i){
int cur=fib(i);
if(cur>=m){
++cnt;
if(cnt>1){
printf(" ");
}
printf("%d",cur);
}
}
if(cnt==0){
printf("No Fibonacci number");
}
// 返回
return;
}
// 返回:素数->1 否则->0
int prime(int p){
if(p<=1){
return 0;
}else if(p==2){
return 1;
}
int result=1;
int limit=(int)sqrt(p)+1;
for(int i=2;i<=limit;++i){
if(p%i==0){
result=0;
break;
}
}
return result;
}
// 输出:n的素数分解n=p+q(要求p最小)
void Goldbach(int n){
// 输出
for(int i=3;i<=n/2;++i){
if(prime(i)==1 && prime(n-i)==1){
printf("%d=%d+%d",n,i,n-i);
break;
}
}
// 返回
return;
}
// 返回:整数的逆序数
int reverse(int number){
// 边界处理
if(number==0){
return 0;
}
// 结果
int result=0;
// 求逆序数
// 保存符号
int sign=1;
if(number<0){
sign=-1;
number*=-1;
}
int cur=0;
while(number>0){
result*=10;
cur=number%10;
number/=10;
result+=cur;
}
result*=sign;
// 返回结果
return result;
}
// 处理:计算两数的和与差
void sum_diff( float op1, float op2, float *psum, float *pdiff ){
*psum=op1+op2;
*pdiff=op1-op2;
// 返回
return;
}
// 处理:移动字母
void Shift(char s[]){
// 健壮性检查
if(s==NULL){
return;
}
// 移动字母
char tmp[3];
int sLen=strlen(s);
for(int i=0;i<3;++i){
tmp[i]=s[i];
}
for(int i=0;i<sLen-3;++i){
s[i]=s[i+3];
}
for(int i=sLen-3;i<sLen;++i){
s[i]=tmp[i+3-sLen];
}
// 返回
return;
}
// 处理:拆分实数的整数和小数部分
void splitfloat(float x,int *intpart,float *fracpart){
// 拆分
*intpart=(int)x;
*fracpart=x-*intpart;
// 返回
return;
}
《《程序设计》函数题|011-020》有1条评论