输出100-1000以内符合个位十位百位之和为10的数

题目

请编写程序,找出符合以下条件的所有数:

  1. 在100~1000范围内;
  2. 这个数是奇数;
  3. 个位、十位、百位数之和为10;

第一次看到这道题,脑子里想出了两种方法:一个是枚举法(也就是一个数一个数的去比对),另一个是需要一点技巧(想了半天也不知道该怎么命名这个方法),接下来我们将列举这两个方法的详解。

一、枚举法

1.思路分析

  1. 给一个for循环,限定取数范围100到1000(假设这个数是x);
  2. 判断这个数x是否为奇数,如果不是奇数则不做处理,是奇数则进行下一步;
  3. 通过处理获得这个x的个位、十位和百位;
  4. 如果个位、十位和百位之和为10,则输出这个数x;

2.流程图

输出100-1000以内符合个位十位百位之和为10的数_第1张图片

3.代码段

  1. head.h
//head.h
#ifndef HEAD_H_  
#define HEAD_H_  

#include "stdio.h"
#include "windows.h"

#endif
  1. main.cpp
// main.cpp
#include "head.h"
int main() {
     
	printf("程序开始\n");

	for (int i = 100; i < 1000; ++ i)
	{
     
		//判断奇数
		if (i & 1)
		{
     
			//获取个、十、百位
			int g = i % 10;
			int s = i / 10 % 10;
			int b = i / 100;
			
			//判断个位、十位和百位之和是否为10
			if (10 == (g + s + b))
			{
     
				printf("%d\n", i);
			}
		}
	}

	system("pause");
}

二、带技巧法

1.思路分析

我们稍加观察和研究,仅从这三位数的每一位来考虑即可;为了方便观察,我们做了下面这个表格,表格列举了每一位的取数可能:
输出100-1000以内符合个位十位百位之和为10的数_第2张图片
通过表格不难看出:

  1. 个位:决定了这个数是否为奇数;个位仅有以下取数可能:1、3、5、7、9;
  2. 十位:取数范围从0~(10 - 个位 - 1),减1的目的是给百位留一位,百位不能为0,否则就不是三位数了;
  3. 百位:不能为0,且满足(10 - 个位 - 十位);

通过以上分析不难看出方法一虽然简单,但比较耗时且每个数需要对比处理;而这个方法可以做到一次全部命中。

2.流程图

输出100-1000以内符合个位十位百位之和为10的数_第3张图片

3.代码段

  1. head.h
//head.h
#ifndef HEAD_H_  
#define HEAD_H_  

#include "stdio.h"
#include "windows.h"

#endif
  1. main.cpp
// main.cpp
#include "head.h"
int main() {
     
	printf("程序开始\n");
	
	//个位数
	for (int g = 1; g < 10; g += 2)
	{
     
		//十位数
		for (int s = 0; s <= (10 - g - 1); ++s)
		{
     
			//个位数
			int b = (10 - s - g);
			printf("%d\n", (b * 100 + s * 10 + g));
		}
	}
	
	system("pause");
}

你可能感兴趣的:(编程题)