蓝桥杯大赛编程大题---带分数

撕酸奶皮子 2013-05-05 11:39:24

标题:带分数

100 可以表示为带分数的形式:100 = 3 + 69258 / 714

还可以表示为:100 = 82 + 3546 / 197

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!


例如:
用户输入:
100
程序输出:
11

再例如:
用户输入:
105
程序输出:
6


资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 3000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

...全文
5515 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
带着梦想飞翔 2014-03-11
  • 打赏
  • 举报
回复
import java.util.Scanner; public class Text01 { public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=input.nextInt(); int k=0; for(int a1=1;a1<10;a1++) { for(int a2=1;a2<10;a2++) { if(a1!=a2) { for(int a3=1;a3<10;a3++) { if(a1!=a3 && a2!=a3) { for(int a4=1;a4<10;a4++) { if(a1!=a4 && a2!=a4 && a3!=a4) { for(int a5=1;a5<10;a5++) { if(a1!=a5 && a2!=a5 && a3!=a5 && a4!=a5) { for(int a6=1;a6<10;a6++) { if(a1!=a6 && a2!=a6 && a3!=a6 && a4!=a6 && a5!=a6) { for(int a7=1;a7<10;a7++) { if(a1!=a7 && a2!=a7 && a3!=a7 && a4!=a7 && a5!=a7 && a6!=a7) { for(int a8=1;a8<10;a8++) { if(a1!=a8 && a2!=a8 && a3!=a8 && a4!=a8 && a5!=a8 && a6!=a8 && a7!=a8) { for(int a9=1;a9<10;a9++) { if(a1!=a9 && a2!=a9 && a3!=a9 && a4!=a9 && a5!=a9 && a6!=a9 && a7!=a9 && a8!=a9) { int[] count={a1,a2,a3,a4,a5,a6,a7,a8,a9}; double num1=0; for(int a=0;a<=(n+"").length();a++) { num1=num1*10+count[a]; if(num1<n) { double num2=0; for(int b=a+1;b<8;b++) { num2=num2*10+count[b]; double num3=0; for(int c=b+1;c<count.length;c++) { num3=num3*10+count[c]; } if(n==num1+num2/num3) { k++; } } } } } } } } } } } } } } } } } } } } } System.out.println(k); } }
KeepThinking_ 2013-05-30
  • 打赏
  • 举报
回复
513048878 2013-05-25
  • 打赏
  • 举报
回复
有没有详细思路啊
w345662584 2013-05-22
  • 打赏
  • 举报
回复
#include<stdio.h> int sum,num; void conut(int p[]) { int i,j,t,a,b,c,z; a=b=c=0; for(i=0;i<7;i++) { a=a*10+p[i]; if(a>num) break; b=0; c=p[8]; z=1; for(j=7;j>i;j--) { b=b+p[j]*z; z*=10; } z=10; for(j=7;j>i;j--) { if(num==a+b/c&&b%c==0) { sum++; printf("%d=%d+%d/%d\n",num,a,b,c); } b=b/10; c=c+p[j]*z; z*=10; } } } void swap(int *p,int *q) { int temp; temp=*p; *p=*q; *q=temp; } void fun(int a[],int n,int j){ int i; if(j==n) { conut(a); return; } for(i=j;i<n;i++) { swap(&a[j],&a[i]); fun(a,n,j+1); swap(&a[j],&a[i]); } } int main(){ int a[10]={1,2,3,4,5,6,7,8,9}; while(scanf("%d",&num)!=EOF){ sum=0; fun(a,9,0); printf("%d\n",sum); } return 0; }
寂静丶 2013-05-12
  • 打赏
  • 举报
回复
1~9不重复不遗漏 应该是指1-9都出现且只出现一次
寂静丶 2013-05-12
  • 打赏
  • 举报
回复
printf("%d = %d + %d/%d\n",ca,ca-ri,v*ri,v); 这个是我临时检测数据用的,不在提交代码中
寂静丶 2013-05-12
  • 打赏
  • 举报
回复
这题可以这样想,我们输入的数字num可以拆分为左右两部分,左边的范围是[1,num-1],我们枚举左边的数left, 则右边为num-left,我们将左边已经使用的数字在flag[Max]中进行标记,同时起到检测的作用,然后利用某种方法构造右边数字的分子son,son*right则是分母,在进行标记检测,符号标准则COUNT++;
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int Max = 9;

int ca,s,cnt,ri;
int flag[Max + 1];
int bak[Max + 1];

int check(int l){                     //标记已有的位,检查数字是否符合规则
	int length = 0;
	while(l){
		if(flag[l%10])return 0;
		flag[l%10] = 1;
		l /= 10;
		length ++;
	}
	s = Max - length;
	return 1;
}

int checks(int n){
	int length = 0;
	memcpy(bak,flag,sizeof(bak));
	while(n){
		if(bak[n%10])return 0;
		bak[n%10] = 1;
		n /= 10;
		length ++;
	}
	return length;
}


void dfs(int depth,int v){                     //通过剩余数字构造分子,并且验证分母
	if(depth <= s / 2){
		if(checks(v * ri) == s - depth){
			printf("%d = %d + %d/%d\n",ca,ca-ri,v*ri,v);
			cnt ++;
		}
		for(int i = 1 ; i <= Max ; i ++){
			if(flag[i])continue;
			flag[i] = 1;
			dfs(depth + 1,v * 10 + i);
			flag[i] = 0;
		}
	}
}

int main(void){
	while(scanf("%d",&ca) == 1){
		cnt = 0;
		for(int left = 1 ; left < ca ; left ++){
			flag[0] = 1;
			if(check(left)){
				ri = ca - left;
				dfs(0,0);
			}
			memset(flag,0,sizeof(flag));
		}
		printf("%d\n",cnt);
	}
	return 0;
}
513048878 2013-05-11
  • 打赏
  • 举报
回复
能给出这个题的思路吗?
dragon_boat 2013-05-09
  • 打赏
  • 举报
回复
引用 4 楼 keepLoveing 的回复:
100=98+2/1,100=97+3/1....这个算吗、我怎么了?
不算~~ 要有1到9存在
skillart 2013-05-08
  • 打赏
  • 举报
回复
蓝桥杯匆忙写的已验证time<2000Ms。

import java.util.Scanner;
public class DaiFenShu
{
	static int kinds=0;
	static int a[]=new int[10];
	static boolean vis[]=new boolean[10];//全排列避免重复
	static void check(int a[],int n,int num)
	{
		int begin=String.valueOf(num).length();
		String str="";
		for(int i=1;i<n;i++) str+=a[i];
		for(int k=1;k<begin+1;k++)
		{
			int num1=Integer.valueOf(str.substring(0,k));
			if(num1<num)
			{
				for(int j=k+(n-k)/2;j<n-1;j++)
				{
					int num2=Integer.valueOf(str.substring(k,j));
					int num3=Integer.valueOf(str.substring(j,n-1));
					if(num2>num3 && num2%num3==0)
					{
						if(num==num1+num2/num3) 
						{	
//							System.out.println(num+" = "+num1+"+"+num2+"/"+num3);
							kinds++;
						}
					}
				}
			}
		}
	}
	static void dfs(int start,int n,int num)
	{
		if(start==n)
		{
			check(a,n,num);
		}
		else
		{
			for(int i=1;i<n;i++)
			{
				if(!vis[i])
				{
					a[start]=i;
					vis[i]=true;
					dfs(start+1,n,num);
					vis[i]=false;
				}
			}
		}
	}
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		int num=cin.nextInt();
		long start=System.currentTimeMillis();
		dfs(1,10,num);
		long end=System.currentTimeMillis();
//		System.out.println(end-start);//运行时间
		System.out.println(kinds);	
	}
}
skillart 2013-05-08
  • 打赏
  • 举报
回复

易水寒1992 2013-05-08
  • 打赏
  • 举报
回复
出现6中结果是因为题中只说1-9只出现一次,没有说都要出现!!!
yidianier 2013-05-08
  • 打赏
  • 举报
回复
引用 5 楼 keepLoveing 的回复:
好贴好贴 特别想问一下楼主,怎么来测 资源约定: 峰值内存消耗(含虚拟机) < 64M CPU消耗 < 3000ms 求回复
一般如果>64M的话,会报错,java heap space.时间的话是能感觉到的
_hug 2013-05-08
  • 打赏
  • 举报
回复
好贴好贴 特别想问一下楼主,怎么来测 资源约定: 峰值内存消耗(含虚拟机) < 64M CPU消耗 < 3000ms 求回复
_hug 2013-05-08
  • 打赏
  • 举报
回复
100=98+2/1,100=97+3/1....这个算吗、我怎么了?
  • 打赏
  • 举报
回复
比赛的时候只做出了 100可以出现6种 不知道是那里出错了? 100=3+69258/714 100=81+5643/297 100=82+3546/197 100=91+5742/638 100=94+1578/263 100=96+1428/357

#include <stdio.h>
int  funa(int a)
{
	int sum[10];
	int temp=0;
	memset(sum,0,10);
	while(a) 
	{
		temp=a%10;
		if(temp==0)
		{
			return 0 ;
		}
		if(sum[temp]==1)
		{
			return 0 ;
		}
		sum[temp]=1 ; 
		a/=10; 
	}
	return 1 ;
}
int  funb(int N, int a ,int b  )
{
	int sum[10];
	int temp=0;
	int i=0 ;
	memset(sum,0,10);
	while(N)
	{
		temp=N%10;
		if(temp==0)
		{
			return 0;
		}
		if(sum[temp]==1)
		{
			return 0 ;
		}
		sum[temp]=1;
		N/=10;
	}
	while(b) //b!=0
	{
		temp=b%10;
		if(temp==0)
		{
			return 0 ;
		}
		if(sum[temp]==1)
		{
			return 0 ;
		}
		sum[temp]=1;
		b/=10;
	}
	while(a)
	{
		temp=a%10; 
		if(temp==0)
		{
			return 0 ;
		}
		if(sum[temp]==1)
		{
			return 0 ;
		}
		sum[temp]=1;
		a/=10; 
	}
	for(i=1;i<10;i++)
	{
		if(sum[i]!=1)
		{
			return 0 ;
		}
	}
	return 1 ; 
}
int daifenshujianyan(int yanzhengshu,int N)
{
	int i=0 ;
	for(i=1;i<=98765;i++)
	{
		if(funa(i))
		{
			if(funb(N-yanzhengshu,yanzhengshu*i,i))
			{
				printf("%d=%d+%d/%d\n",N,N-yanzhengshu,yanzhengshu*i,i);
				return 1; 
			}
		}
	}
	return 0 ;
}
void main()
{

	
	int N =0 ;
	int i=0 ;
	int count=0;
	scanf("%d",&N);
	freopen("D:\\mytemp.txt","w",stdout);
	for(i=1;i<N;i++)
	{
		if(daifenshujianyan((N-i),N))
		{
			count++;
		}
	}
	printf("%d",count);
}

一开始没理解题意,慢慢改过来的
Inhibitory 2013-05-06
  • 打赏
  • 举报
回复
100 = 3 + 69258 / 714 100 = [x = 1-99] + (100 - x) * i / i; (i = 1, 2, 3, ...:i的位数与i * (100 - x)的位数之和小于9)
andycpp 2013-05-06
  • 打赏
  • 举报
回复
100=7+4836/52
100=82+3546/197
100=94+1578/263
100=81+5643/297
100=96+1428/357
100=81+7524/396
100=96+1752/438
100=96+2148/537
100=91+5742/638
100=91+5823/647
100=3+69258/714
100=91+7524/836
public class MyTest {

	private static Set<Integer> all = new HashSet<>();
	private static Set<Integer> temp1 = new HashSet<>();
	private static Set<Integer> temp2 = new HashSet<>();
	
	public static void main(String[] args) {
		for(int i= 1; i<9876; i++) {
			all.clear();
			if(isDuplicate(i, temp1)) {
				continue;
			}
			for(int j = 2; j<100; j++) {
				if(!isDuplicate(j*i, temp1)) {
					int y = 100-j;
					if(!isDuplicate(y, temp2) && all.size()==9) {
						System.out.println(100 + "=" + y + "+" + j*i + "/" + i);
					}else {
						all.removeAll(temp1);
					}
				}
			}
		}
	}
	
	private static boolean isDuplicate(int n, Set<Integer> temp) {
		temp.clear();
		int i = 0;
		boolean flag = false;
		while(n>0) {
			int x = n % 10;
			temp.add(x);
			n = n/10;
			i++;
		}
		if(temp.contains(0) || temp.size()<i || temp.removeAll(all)) {
			flag = true;
		}else {
			all.addAll(temp);
		}
		return flag;
		
	}
}

58,451

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧