c语言菱形打印

#include<stdio.h>
#include<math.h>

//这里的8不知道c语言中获取方式
#define int_len (sizeof(int)*8)

int switch_to_positive_num(char *str);
int printstar(int n);

int main(int argc,char *argv[])
{
	int num;
	if(argc != 2){
		printf("error parameter number;\n");
		return 1;
	}
	num = switch_to_positive_num(argv[1]);
	if(num == -1){
		printf("error parameter;\n");
		return 1;
	}
	printf("input num:%d\n",num);
	int n = printstar(num);
	printf("sruplus:%d\n",n);
	return 1;
}

/*
	len为菱形长度,
	sruplus为参数用于打印菱形后剩余数量
	len计算基于菱形总数和菱形长度的如下关系:
		(len-1)*((len+1)/2)+1 = num
	上述等式是基于将菱形下半部分平移至上半部分,然后依据图形计算得出
*/
int printstar(int n)
{
	int len,sruplus,i,j,tmp;
	if(n<1)
		return n;
	//开方反算取整并取最大奇数;
	len = (int)sqrt((n-1)*2+1);
	len = len%2 ==0 ? len-1 : len;	
	sruplus = n - ((len-1)*(len+1)/2+1);
	for(i=1;i<=len*2-1;i+=2){
		//借助临时变量的计算,使得一个大循环内打印上下两个部分
		tmp = i<=len ? i : 2*len-i;
		printf("%*s",(len-tmp)/2,"");
		for(j=0;j<tmp;j++)
			printf("*");
		printf("\n");
	}
	return sruplus;
}

//将参数字符串转为带符号正int型整数
int switch_to_positive_num(char *str)
{
	int max;
	long res;
	char c;
	max = (~0)^(1<<(int_len-1));
	res = 0;
	while((c = *str++) != '\0'){
		if(c < '0' || c > '9')
			return -1;
		res = res*10 + (c - '0');
		if(res > max)
			return -1;
	}
	return (int)res;
}

  

posted on 2021-04-12 16:03  songpan  阅读(156)  评论(0编辑  收藏  举报

导航