2013-11-17 实验之带分数(优化穷举思想)

来源:互联网 发布:狂湿淘宝店 编辑:程序博客网 时间:2024/06/05 00:47

题目

标题:带分数
    100 可以表示为带分数的形式:100 = 3 + 69258 / 714
    还可以表示为:100 = 82 + 3546 / 197
    注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
    类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。


思想

首先要对程序优化后穷举,如等于号的第一个数字必比输入的数下,接下来,穷举每一个数的优化思想,分子的位数必比分母的位数多。

程序的第二种思想是对剩余的数,进行全排列后比较,其实思想也是一样的,但是效率会更高,因为对针对的数来测试。


程序实现

#include<stdio.h>#include<stdlib.h>unsigned char flags[10];void init_flags(){int i;for(i = 0;i < 10; i++){flags[i] = 0;}flags[0] = 1;}int exec_is(){int i;for(i = 1;i < 10; i++){if(flags[i] == 0) {return 0;}}return 1;}int exec_count(){int count = 0;int i;for(i = 1;i < 10; i++){if(flags[i] == 0) {count++;}}return count;}int exec_first(int value){while(value > 0){int k = value %10;if(flags[k]){return 0;}else{flags[k] = 1;}value /= 10;}return 1;}void exec_operation(int value, int num){int m= 1; //m<n n=value*mint n;int m_bit = exec_count()/2+1;int temp = 1;int count=1;while(count<=m_bit){temp *=10;count++;}while(m< temp ){n = value * m;if(exec_first(m) && exec_first(n) && exec_is()){printf("%d = %d + %d / %d\n", num, num - value, n, m);}init_flags();exec_first(num - value);m++;}}int main(void){int num;scanf("%d", &num);int i;for(i = 1;i < num; i++){init_flags();if(exec_first(i)){exec_operation(num - i, num);}}return 0;}



原创粉丝点击