《编程之美》4.10数字哑谜和回文

第一题:找出符合条件的九位数,每位数互不相同(1~9的某个排列),满足高n位能被n整除。例如abcdefghi,高两位ab能被2整除,高三位abc能被3整除,以此类推。

相对简单的一种解法

#include "stdafx.h"
#include <iostream>
using namespace std;

void findNum(bool* used,int index,long sum)
{
	if(index !=0 && sum%index != 0)
	{
		return;
	}
	else
	{
		if(index==9)
		{
			cout<<"The number is "<<sum<<" ."<<endl;
			return;
		}
	}

	for(int i=1;i<=9;i++)
	{
		if(used[i]==false)
		{
			used[i]=true;
			findNum(used,index+1,sum*10+i);
			used[i]=false;
		}
	}

	return;
}

int main()
{
	bool used[10]={false};

	int index=0;
	long sum=0;
	findNum(used,index,sum);

	 system("pause");
	 return 0;
}

第二题:人过大佛寺*我=寺佛大过人

code

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int findPalindrome(int sum)
{
	vector<int> s;

	int temp=sum;
	while(temp!=0)
	{
		int a=temp%10;
		s.push_back(a);
		temp=temp/10;
	}

	temp=0;
	vector<int>::iterator it=s.begin();
	while(it!=s.end())
	{
		temp=temp*10+*it;
		it++;
	}

	return temp;
}

void findNum(bool* used,int index,long sum)
{

	if(index==5)
	{
		int temp=findPalindrome(sum);

		for(int i=1;i<=9;i++)
		{
			if(used[i]==false)
			{
				if(sum*i==temp)
				{
					cout<<sum<<" * "<<i<<" = "<<temp<<endl;
					return;
				}
			}
		}

		return;
	}

	for(int i=1;i<=9;i++)
	{
		if(used[i]==false)
		{
			used[i]=true;
			findNum(used,index+1,sum*10+i);
			used[i]=false;
		}
	}

	return;
}

int main()
{
	bool used[10]={false};

	int index=0;
	long sum=0;
	findNum(used,index,sum);

	 system("pause");
	 return 0;
}

时间: 2024-08-30 15:05:01

《编程之美》4.10数字哑谜和回文的相关文章

编程之美 2.10 扩展问题

编程之美 2.10 扩展问题 题目如下: 如果需要找出N个数组中的第二大数,需要比较多少次呢?是否可以使用过类似的分治思想来降低比较的次数呢? 解法一 我们最容易想到的方法就是:我们数组进行排序,取倒数第二个数即为所求.但是比较次数是很高的,不可取. 解法二 用2个中间变量来保存最大值和第二大的值,遍历一次数组即可得到最大值和第二大的值.比较次数为:2*N 实现代码如下: package com.wrh.firstpro; import java.util.Arrays; /* * 寻找数组中的

编程之美--2.10

题目描述:求数组的最大值和最小值,并且计算比较次数 思路: (1)普通思路是遍历一遍,得比较2*N次 (2)分治,具体计算可以参考书上内容,算法时间复杂度是O(logn) 1 #include <iostream> 2 #include <queue> 3 #include <climits> 4 #include <algorithm> 5 #include <memory.h> 6 #include <stdio.h> 7 usi

判断一个数字是否是回文数字,如果是则打印出100以内的回文数字,若不是只给出提示信息。

回文数字指的是什么呢?什么是回文数字呢? 回文数字的特征是:一组数字,从左读和从右读都是一样的,比如:123.123321.12345654321 public class HuiWenTest{    public static void main(String[] args)    {        Scanner sc = new Scanner(System.in); try        {            System.out.println("请输入你要判断的数字: &quo

判断一个数字是否为回文数

Determine whether an integer is a palindrome. Do this without extra space.(source) 判断一个数字是否为回文数,并且不使用额外的存储空间. "回文"是指正读反读都能读通的句子,那么回文数,就很容易理解,就是指一个数正反读的值是相同的.还有一个要求是不要使用额外的存储空间. Hints: 要将一个数的最高位与最低位比较,取出一个数的最低位容易(x%10),但要得到高位却很难. Solution 1: 首先得知

LeetCode—Palindrome Number 数字是否是回文数字

Determine whether an integer is a palindrome. Do this without extra space. 检测当前数字是否是回文数字,同时不能增加额外的内存空间,这里一个注意的点就是 负数 都不可能是回文数字 然后是检测出来每一位数字进行比较 代码还是写得比较繁琐,主要的一个点就是数字的位数是基数位和偶数位的时候处理的过程是不同的 class Solution { public: int GetH(int x,int num)//获得对应位置的数字 {

leecode---09---数字,取余整除---判断一个数字是否是回文

https://leetcode.com/problems/palindrome-number/description/ 题意 判断一个数字是否是回文 分析 32132132100 /100 删去0的部分 %100 留下0的部分 代码 class Solution { public boolean isPalindrome(int x) { if (x < 0) return false; //计算到x的最高位 int div = 1; while (div * 10 <= x) { div

C和指针--编程题9.14第10小题--判断回文函数

题目: 编写函数 int palindrom( char *string); 如果参数字符串是个回文,函数就返回真,否则就返回假.回文就是指一个字符串从左向右读和从右向左读是一样的.函数应忽略所有的非字母字符,而且在进行字符比较时不用区分大小写. 前提是空白字符.标点符号和大小写状态被忽略,当Adam第1次遇到Eve时他可能会说的一句话:"Madam,I'm Adam"就是回文一例. 分析题目,题目中没有规定空字符串和全是非字母字符的情况是否属于回文,我私自将空字符串归为回文,将全是非

编程之美2015 资格赛 hihocoder 题目2: 回文字符序列

思路:暴力搜,用BFS的方式,生成每一种可能,再对每一种可能进行判断是否回文,进行统计.严重超时!计算一个25个字符的,大概要20多秒! 1 #include <iostream> 2 #include <deque> 3 #include <string> 4 #include <stdio.h> 5 #include <cstring> 6 using namespace std; 7 8 deque<string> a; 9 1

java语言判断一个数字是否为回文数字

判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数. 示例 3: 输入: 10 输出: false 解释: 从右向左读, 为 01 .因此它不是一个回文数. 进阶: 你能不将整数转为字符串来解决这个问题吗? 解法一:使用字符串反转,比较反转前后的字符串是否相等 class