初始C语言时一些简单的小程序(四)

一入代码深似海,从此妹子是路人.

进过一段时间的学习和探讨,对C语言大家应该有了进一步认识和了解,所以今天继续为大家带来一些相对简单,但需要一些小逻辑的问题,那么直接进入主题吧.

(一)在屏幕上输出以下图案
 

*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*

这种输出图形的问题,当然有一个简单的方法-.-,有人会不会想到直接使用printf函数来实现,因为只需要

printf("*\n***\n*****\n*******\n*********\n***********\n*************\n***********\n*********\n*******\n*****\n***\n*\n");

如果使用这种方法也太low了吧,有损我们高级计算机程序员的风度,所以得用我们程序员的方法来解决.上代码

int main(){
	int i = 0;
	int j = 0;
	for (i = 1; i <= 7; i++){//观察图形,最长行的行数是7,所以以此为分界点
		printf("*");
		if (i>1){
			for (j = i; j > 1; j--){//逻辑:*是以1,3,5,7,9这样基数增长的,那么,每一行比前一行多两个*,逻辑部分立马清晰
				printf("**");
			}
			printf("\n");//换行条件的确定,确保每一行的*"管饱"
			continue;
		}
		printf("\n");
	}
	for (i = 6; i > 0; i--){//同上,这里至于要倒置即可
		printf("*");
		if (i>1){
			for (j = i; j > 1; j--){
				printf("**");
			}
			printf("\n");
			continue;
		}
		printf("\n");
	}
	system("pause");
	return 0;
}

难点:

1)get到*增长的规律,发现是基数增长后,使用for循环简单实现即可

2)倒置时注意从多到少,逻辑并不难

 

(二)求出0~999之间的所有“水仙花数”并输出。

 

首先,什么是水仙花数呢?

在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数:
153 = 1^3 + 5^3 + 3^3。
370 = 3^3 + 7^3 + 0^3。
371 = 3^3 + 7^3 + 1^3。
407 = 4^3 + 0^3 + 7^3。

所以要找到关键点:一个N位数,其各个位数上的数的N次方和等于该数。

0~999,有个位数的0~9,有两位数10~99,有三位数100~999,那么,分开讨论,逐个击破,答案自然而出:

int main(){
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++){
		if (i == i){
			printf("%d\n", i);
		}
	}
	for (i = 10; i < 100; i++){
		if (i == (pow((i / 10), 2) + pow((i % 10), 2))){
			printf("%d\n", i);
		}
	}
	for (i = 100; i < 1000; i++){
		if (i == (pow((i / 100), 3) + pow(((i % 100) / 10), 3) + pow(((i % 100) % 10), 3))){
			printf("%d\n", i);
		}
	}
	system("pause");
	return 0;
}

这里并没有对代码进行注释,想把其中单独一个拿出来解读,其他的也可以通过类似的逻辑解决:

if (i == (pow((i / 10), 2) + pow((i % 10), 2)))

就拿两位数判断条件来说:i/10,在编程中会得到一个整数,而不是某个小数,如13/10 == 1,而不是1.这样就得到了十位上的数.当然后面的i%10,13%10 == 3,这样得到的是个位上的数.三位数的逻辑判断条件与这个相似,这里不多做解释.

(三)求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字, 
例如:2 + 22 + 222 + 2222 + 22222

 

当刚看到这个问题时,大家会立马想到2 + 2*10+2 + 2*100+2*10+2+2*1000+2*100+2*10+2........

好像抓到了某些重要的东西:2*10^0+2*10^1+2*10^0+....

那么题目也就迎刃而解

int main(){
	int i = 5;//因为aaaaa嘛,最多为五位数,所以这里是约束位数的条件
	int j = 0;
	int input = 0;
    printf("请输入一个1~9的数字:");
	scanf("%d", &input);//输入一个数,当然默认为前面说的1~9
	printf("%d\n", input);
	int sum = 0;
	int num = 0;
	while(i > 1){
		for (j = 0; j < 5; j++){
			sum = sum + (input*(pow(10, j)));//利用循环先把每一个几位数的值确定
			printf("%d\n", sum);
			num += sum;//通过num来垒加
			i--;
		}
	}
	printf("%d\n", num);
	system("pause");
	return 0;
}

这个程序其实不完美,因为如果输入的数不是1~9呢,这时系统应该报错,返回重新输入,这里先不做过多解释,下一章会详细说到这个问题.

难点:

1)找到循环的特征:10^i次方

2)循环每次只找出了几位数所对应的值,需要另外一个数对垒加进行记录.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值